2011-01-09 84 views
7

考虑下面的代码:理解C++结构尺寸

struct CExample { 
    int a; 
}    

int main(int argc, char* argv[]) { 

    CExample ce1; 
    CExample ce2; 

    cout << "Size:" << sizeof(ce1) << " Address: " << &ce1 << endl; 
    cout << "Size:" << sizeof(ce2) << " Address: " << &ce2 << endl; 

    CExample ceArr[2]; 
    cout << "Size:" << sizeof(ceArr[0])<< " Address: "<< &ceArr[0] <<endl; 
    cout << "Size:" << sizeof(ceArr[1])<< " Address: "<< &ceArr[1] <<endl; 

    return 0; 
} 

输出例如:
CE1:大小= 4,地址:0039FAA0
CE2:大小= 4,地址:0039FA94
ceArr [0] :大小= 4,地址:0039FA84
ceArr [1]:大小= 4,地址:0039FA88

随着代码存在第一两个对象的地址(CE1和CE2),但是之间的12字节的有只是一个4字节的差异赌注查看数组中的对象。

我认为数据调整与这个问题有关,但我仍然难倒了。任何想法这里究竟发生了什么?

+2

上面的输出是什么?在代码中发表意见? – 2011-01-09 16:51:40

回答

15

因为数组中的对象需要连续。在堆栈中(在源代码中,而不是在机器上)连续声明的对象不是[需要连续],尽管它们可以是。

+1

那么,他们**可以**,但他们不**必须**。 – 2011-01-09 16:56:37

+0

@比利这就是我所说的。 – 2011-01-09 16:57:55

+0

对不起。误解。第二句话,自己读,似乎说,他们从来没有连续。对不起:( – 2011-01-09 16:58:57

6

该标准对此没有提及。编译器可以自由地在项目之间插入任何想要的填充。

(如果我猜,我猜你的编译器实现在调试模式下某种形式的堆栈保护/金丝雀(和你在调试模式下)编译)

0

的原因是,在大多数架构,未对齐的负载都很慢。请参阅data structure alignment上的维基百科条目以获得更好的解释。编译器将每个数据结构放置在数据字的开头。但是,在数组中,这些项目会连续放置在内存中(正如C++标准所要求的那样)。

1

编译器不仅使用堆栈保留本地变量 - 它还将其用于例如参数传递以及由std::cout引起的一些开销。这可能是您的变量之间的额外空间用于。

如果你不是让你的变量static,像这样:

static CExample ce; 
static CExample ce2; 

static CExample ceArr[2]; 

...变量将被放置在BSS内存,而是和校准将更有可能是你所期望的。

为什么阵列被打包,而单个项目没有被澄清其他答案...