2016-12-01 101 views
2

看看这两个结构嵌套结构中的数据如何存储和填充?

struct parent_t 
{ 
    short num1; 
    char chrA; 
    char chrB; 
    char chr1; 
}; 

struct child_t 
{ 
    struct parent_t parent; 
    char chr2; 
}; 

正如我们所知,填充可能加入到结构成员,以便将其提高到一个舒适的RAM友好的大小。在parent_t的情况下,chr1可能会填充因为它的微不足道。虽然chrAchrB可能会合并,并在RAM中共享相同的单词。

现在,如果我们看看child_t,它有chr2,它本身会被填充。我的问题是chr1chr2是optomise如chrAchrB?如果是这样,那叫什么?

对于这个例子,我假设1字= 1短= 2个字符。

+3

我怀疑你的问题的答案是编译器特定的。不同的编译器可能会以不同的方式进行填充和对齐。你可以尝试转储内存(使用地址和sizeof())并检查。 – eyalm

+1

http://stackoverflow.com/questions/4306186/structure-padding-and-packing – John

+0

实际上,你会使用'offsetof'宏(这在所有环境中都不是标准的,但它足够简单以查找/实现)。是的,这绝对会根据您使用的编译器进行更改。 – John

回答

1

我的问题是将chr1和chr2 optomise,如chrA和chrB?

不,他们不会按照您描述的方式进行优化。

原因是sizeof(struct parent_t)必须在程序中随处可见。

如果它被优化的代码会失败:

struct parent_t p; 
struct child_t c; 
//... initialize p 
memcpy(&c.parent, &p, sizeof(struct parent_t)); 

这样的代码是有效的,必须工作。换句话说 - 你描述的优化不会发生。

+0

为了完整起见,当一些编译器可以证明结构的所有引用都是当前翻译单元的本地时,它们会对结构的字段进行重新排序。但是这是非常罕见的,AFAIR在GCC和LLVM中都没有。 – yugr