GCC会在最终可执行文件中移除未使用的结构体成员吗?
问题:gcc/g++是否会移除结构体中未使用的成员?
gcc/g++(9.4或7.3版本)是否会在输出文件中移除未使用的c和pc成员?因为以下代码仅访问C::i和C::j,并未访问C::c和C::pc。
#include <iostream> struct C { // i, j is used below int i; int j; // c, pc is not used char c; char *pc; C() : i(2) {} }; int main() { C c; c.j = 9; std::cout << c.j << c.i << sizeof(c) << std::endl; }
解答
不会移除这些未使用的成员,但未访问成员对应的指针偏移代码不会出现在最终可执行文件中。
具体原因:
- 结构体成员通过基址+固定偏移量的方式访问,编译器必须严格遵循C++标准规定的结构体内存布局:成员按声明顺序排列,同时满足内存对齐要求。即使成员未被访问,编译器也不能随意删除,否则会破坏
sizeof(C)的结果一致性,而你的代码中还直接输出了sizeof(c),这进一步约束了编译器必须保留完整的结构体布局。 - 未被访问的成员,其对应的访问代码(比如指针偏移计算)确实不会出现在最终可执行文件里,但结构体本身的内存布局和大小不会改变。
内容的提问来源于stack exchange,提问作者Aaron Q
相关产品推荐
相关产品推荐

