Tôi đã đọc rằng biến số double
(8 byte) phải được căn chỉnh 8 byte.Bối rối về căn chỉnh dữ liệu cho các biến kép
Bây giờ nếu tôi đang viết toàn bộ mã cho chương trình của mình, thì tôi có thể biến các biến số double
thành 8 byte được căn chỉnh mà không gặp bất kỳ sự cố nào.
Nhưng nói rằng tôi có kịch bản sau: Tôi tạo một hàm tạo biến số double
trên ngăn xếp và tôi cung cấp chức năng này cho người khác để sử dụng nó trong chương trình của anh ấy. Bây giờ khi chức năng của tôi được gọi, chức năng của tôi sẽ không có ý tưởng nếu biến số double
sẽ được tạo trên một địa chỉ có thể chia cho 8!
Sự cố này có thể giải quyết được không (tôi lưu ý rằng nếu không có sự giải quyết cho vấn đề này), tôi không quan tâm đến sự mất mát hiệu năng không đáng kể từ việc không căn chỉnh các biến số double
của tôi.
AFAIK 'gcc' đã căn chỉnh ngăn xếp thành 16 byte, có nghĩa là nó cũng đáp ứng các yêu cầu căn chỉnh 8 byte. –
@ 眠 り ネ ロ ク: Depends.on phiên bản Linux. Tôi không thể nhớ lại khi nào nhưng trước năm 2009, Linux vẫn đang sử dụng SysV i386 ABI lịch sử mà chỉ yêu cầu sự liên kết ngăn xếp 4 byte. GCC thay đổi thành 16 (phá vỡ với ABI ban đầu) và sau đó ABI đã được sửa đổi thành liên kết chồng 16 byte trên một cuộc gọi hàm. Vì vậy, về mặt kỹ thuật, sự liên kết được sử dụng phụ thuộc vào phiên bản Linux. –
@MichaelPetch đúng. Theo https://en.wikipedia.org/wiki/X86_calling_conventions: *** Kể từ phiên bản GCC 4.5 **, ngăn xếp phải được căn chỉnh với ranh giới 16 byte khi gọi một hàm (các phiên bản trước chỉ yêu cầu 4 byte alignment.) * –