第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

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

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è)置。


查看完整回答
反對(duì) 回復(fù) 2019-05-22
?
婷婷同學(xué)_

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


查看完整回答
反對(duì) 回復(fù) 2019-05-22
  • 4 回答
  • 0 關(guān)注
  • 974 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)