0%

c++空对象数组内存占用

问题

  1. gcc编译器会做很多优化, c++规范规定空对象大小不能为0, sizeof返回值也必须大于0
  2. gcc中对空对象强制保留1byte
  3. 那么, 空对象构成的数组会做优化吗?

验证

1
2
3
4
5
6
7
8
9
10
11
12
struct Empty {};
void to_leaf()
{
}
/*
0x0000000000405098 <+0>: push %rbp
0x0000000000405099 <+1>: mov %rsp,%rbp
0x000000000040509c <+4>: sub $0x70,%rsp
0x00000000004050a0 <+8>: callq 0x405092 <to_leaf()>
=> 0x00000000004050a5 <+13>: leaveq
0x00000000004050a6 <+14>: retq
*/
  1. 只有非叶子函数才会真的执行开辟栈空间, 我们使用 一个空调用把使用栈的函数强转为非叶子函数
  2. 可以看到 Empty arr[100]分配了112个byte, 说明这里确实没有做处理, 不过也是合理的
  3. 至于为啥是112, 这就是涉及栈对齐了,对比下面这个函数就知道了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void test() {
Empty arr[100]{};
to_leaf();
}
/*
0x00000000004050a7 <+0>: push %rbp
0x00000000004050a8 <+1>: mov %rsp,%rbp
0x00000000004050ab <+4>: sub $0x70,%rsp
0x00000000004050af <+8>: callq 0x405092 <to_leaf()>
=> 0x00000000004050b4 <+13>: leaveq
0x00000000004050b5 <+14>: retq
*/

void test_1() {
Empty arr[112]{};
to_leaf();
}

结论: 即使是空对象构成的数组, 每个元素也会占用1byte, 不会优化掉