Przeczytałem, że zmienna double
(8 bajtów) musi być wyrównana do 8 bajtów.Mylić o wyrównaniu danych dla podwójnych zmiennych
Teraz, jeśli piszę cały kod dla mojego programu, mogę ustawić zmienne 8 bajtów double
wyrównane bez żadnego problemu.
Ale powiedz, że mam następujący scenariusz: Tworzę funkcję, która tworzy zmienną double
na stosie, a ja daję tę funkcję komuś innemu, aby użyć jej w swoim programie. Teraz, gdy moja funkcja zostanie wywołana, moja funkcja nie będzie miała pojęcia, czy zmienna double
zostanie utworzona na adres, który można podzielić przez 8!
Czy ten problem może zostać rozwiązany (zauważ, że nie dbam o znikomą utratę wydajności, nie dostosowując moich zmiennych double
, ale jestem zainteresowany, aby wiedzieć, czy istnieje rozwiązanie tego problemu)?
AFAIK 'gcc' już wyrównuje stos do 16 bajtów, co oznacza, że spełnia również 8-bajtowe wymagania wyrównania. –
@ 眠 り ネ ロ ク: Depends.on wersja systemu Linux. Nie pamiętam, kiedy przed 2009 r. Linux nadal korzystał z historycznego SysV i386 ABI, który wymagał tylko 4-bajtowego wyrównania stosów. GCC zmienił to na 16 (zerwanie z oryginalnym ABI), a następnie ABI zmodyfikowano tak, aby był 16-bajtowym wyrównaniem stosu w wywołaniu funkcji. Technicznie, jakie dostosowanie jest w użyciu, zależy od wersji systemu Linux. –
@MichaelPetch w prawo. Zgodnie z https://en.wikipedia.org/wiki/X86_calling_conventions: *** Ponieważ GCC w wersji 4.5 **, podczas wywoływania funkcji stos musi być wyrównany do 16-bajtowej granicy (poprzednie wersje wymagały tylko 4-bajtowego wyrównanie.) * –