4 回答

TA貢獻1856條經驗 獲得超17個贊
這是因為添加了填充以滿足對齊約束。數據結構對齊會影響程序的性能和正確性:
錯誤對齊訪問可能是一個很難的錯誤(通常
SIGBUS
)。錯誤對齊的訪問可能是軟錯誤。
在硬件中進行了更正,以適度降低性能。
或者通過軟件仿真進行校正,以降低性能。
此外,原子性和其他并發保證可能會被破壞,從而導致細微的錯誤。
以下是使用x86處理器的典型設置(所有使用的32位和64位模式)的示例:
struct X{ short s; /* 2 bytes */ /* 2 padding bytes */ int i; /* 4 bytes */ char c; /* 1 byte */ /* 3 padding bytes */};struct Y{ int i; /* 4 bytes */ char c; /* 1 byte */ /* 1 padding byte */ short s; /* 2 bytes */};struct Z{ int i; /* 4 bytes */ short s; /* 2 bytes */ char c; /* 1 byte */ /* 1 padding byte */};const int sizeX = sizeof(struct X); /* = 12 */const int sizeY = sizeof(struct Y); /* = 8 */const int sizeZ = sizeof(struct Z); /* = 8 */
可以通過對齊對成員進行排序來最小化結構的大?。ò凑栈绢愋椭械拇笮∨判颍?code>Z如上例中的結構)。
重要說明:C和C ++標準都聲明結構對齊是實現定義的。因此,每個編譯器可能選擇以不同方式對齊數據,從而導致不同且不兼容的數據布局。因此,在處理將由不同編譯器使用的庫時,了解編譯器如何對齊數據非常重要。某些編譯器具有命令行設置和/或特殊#pragma
語句來更改結構對齊設置。

TA貢獻1844條經驗 獲得超8個贊
這可能是由于字節對齊和填充,因此結構在平臺上產生偶數個字節(或字)。例如,在Linux上的C中,有以下3種結構:
#include "stdio.h"
struct oneInt {
int x;
};
struct twoInts {
int x;
int y;
};
struct someBits {
int x:2;
int y:6;
};
int main (int argc, char** argv) {
printf("oneInt=%zu\n",sizeof(struct oneInt));
printf("twoInts=%zu\n",sizeof(struct twoInts));
printf("someBits=%zu\n",sizeof(struct someBits));
return 0;
}
具有大?。ㄒ宰止潪閱挝唬┑某蓡T分別是4字節(32位),8字節(2x32位)和1字節(2 + 6位)。上面的程序(在Linux上使用gcc)將大小打印為4,8和4 - 其中最后一個結構被填充,因此它是一個單詞(在我的32位平臺上為4 x 8位字節)。
oneInt=4
twoInts=8
someBits=4
- 4 回答
- 0 關注
- 967 瀏覽
添加回答
舉報