4 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
這是因?yàn)樘砑恿颂畛湟詽M足對(duì)齊約束。數(shù)據(jù)結(jié)構(gòu)對(duì)齊會(huì)影響程序的性能和正確性:
錯(cuò)誤對(duì)齊訪問可能是一個(gè)很難的錯(cuò)誤(通常
SIGBUS
)。錯(cuò)誤對(duì)齊的訪問可能是軟錯(cuò)誤。
在硬件中進(jìn)行了更正,以適度降低性能。
或者通過軟件仿真進(jìn)行校正,以降低性能。
此外,原子性和其他并發(fā)保證可能會(huì)被破壞,從而導(dǎo)致細(xì)微的錯(cuò)誤。
以下是使用x86處理器的典型設(shè)置(所有使用的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 */
可以通過對(duì)齊對(duì)成員進(jìn)行排序來最小化結(jié)構(gòu)的大?。ò凑栈绢愋椭械拇笮∨判颍?code>Z如上例中的結(jié)構(gòu))。
重要說明:C和C ++標(biāo)準(zhǔn)都聲明結(jié)構(gòu)對(duì)齊是實(shí)現(xiàn)定義的。因此,每個(gè)編譯器可能選擇以不同方式對(duì)齊數(shù)據(jù),從而導(dǎo)致不同且不兼容的數(shù)據(jù)布局。因此,在處理將由不同編譯器使用的庫時(shí),了解編譯器如何對(duì)齊數(shù)據(jù)非常重要。某些編譯器具有命令行設(shè)置和/或特殊#pragma
語句來更改結(jié)構(gòu)對(duì)齊設(shè)置。

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
這可能是由于字節(jié)對(duì)齊和填充,因此結(jié)構(gòu)在平臺(tái)上產(chǎn)生偶數(shù)個(gè)字節(jié)(或字)。例如,在Linux上的C中,有以下3種結(jié)構(gòu):
#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;
}
具有大?。ㄒ宰止?jié)為單位)的成員分別是4字節(jié)(32位),8字節(jié)(2x32位)和1字節(jié)(2 + 6位)。上面的程序(在Linux上使用gcc)將大小打印為4,8和4 - 其中最后一個(gè)結(jié)構(gòu)被填充,因此它是一個(gè)單詞(在我的32位平臺(tái)上為4 x 8位字節(jié))。
oneInt=4
twoInts=8
someBits=4
- 4 回答
- 0 關(guān)注
- 974 瀏覽
添加回答
舉報(bào)