You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:37:49