亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么structof sizeof不等于每個成員的sizeof總和?

為什么structof sizeof不等于每個成員的sizeof總和?

FFIVE 2019-05-22 13:03:00
為什么structof sizeof不等于每個成員的sizeof總和?為什么sizeof操作員返回的結構尺寸大于結構成員的總尺寸?
查看完整描述

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語句來更改結構對齊設置。


查看完整回答
反對 回復 2019-05-22
?
婷婷同學_

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


查看完整回答
反對 回復 2019-05-22
  • 4 回答
  • 0 關注
  • 967 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號