V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sl0000
V2EX  ›  C

C++ class 数据对齐优化的问题?

  •  
  •   sl0000 · 2019-01-23 09:13:12 +08:00 · 3200 次点击
    这是一个创建于 2126 天前的主题,其中的信息可能已经有所发展或是发生改变。
    class MyClass1 {
    public:
    	int a;
    	char c1;
    	int b;
    	char c2;	
    };
    
    class MyClass2 {
    public:
    	int a;
    	int b;
    	char c1;
    	char c2;
    };
    
    

    sizeof(MyClass1); // 16

    sizeof(MyClass2); // 12

    不能自动数据对齐优化, 这是我的编译器的问题吗? class size 的影响有多大?

    我的理解是数据对齐优化后, 能略微减少内存开销;

    17 条回复    2019-02-03 02:35:21 +08:00
    meik2333
        1
    meik2333  
       2019-01-23 09:18:09 +08:00 via Android   ❤️ 1
    如果这种地方自动优化了,那么要怎么通过指针加偏移量来访问成员呢...
    felixlong
        2
    felixlong  
       2019-01-23 09:20:10 +08:00 via Android   ❤️ 1
    你理解错了。
    1 数据对齐优化是指 根据数据类型的大小以访问最快的方式来对齐。比如 int 按 4byte 对齐。longlong 以 8byte 来对齐。
    2. 根据 c/c++对 structure 的规则。编译器是不可以改变 class 里面成员顺序的。
    sl0000
        3
    sl0000  
    OP
       2019-01-23 09:27:36 +08:00
    你是说通过指针加偏移量来访问私有成员?
    mxi1
        4
    mxi1  
       2019-01-23 09:29:01 +08:00
    @meik2333 c++类的内存排布与 c 的结构体是不一样的, 不能去假设内存偏移和成员变量的对应关系;
    wizardoz
        5
    wizardoz  
       2019-01-23 09:31:14 +08:00
    #pragma pack(1)
    mxi1
        6
    mxi1  
       2019-01-23 09:32:43 +08:00   ❤️ 1
    C++类的构造函数会根据成员变量声明的顺序进行初始化; 楼主说的"优化",可能会与之冲突. 我猜这是一个原因吧.
    wizardoz
        7
    wizardoz  
       2019-01-23 09:32:58 +08:00   ❤️ 1
    @wizardoz 不好意思,有点答非所问。其实第一个结构体就是一种优化,只不过它是寻址效率上的优化而不是存储空间上的优化。
    josephpei
        8
    josephpei  
       2019-01-23 09:57:57 +08:00
    数据对齐优化是加速寻址速度,会浪费内存空间,不是减少内存空间开销,简单说就是用空间换时间
    raynor2011
        9
    raynor2011  
       2019-01-23 10:05:29 +08:00
    内存对齐优化就是 memory access 的优化啊,并不是指优化存储空检,优化存储空间最直接的就是关闭内存对齐优化
    meik2333
        10
    meik2333  
       2019-01-23 10:05:44 +08:00 via Android
    @mxi1 这个我不是很清楚,谢谢指正啦
    glacer
        11
    glacer  
       2019-01-23 10:25:58 +08:00
    楼主是 32 位机器?
    sl0000
        12
    sl0000  
    OP
       2019-01-23 10:27:58 +08:00
    @glacer 64bit
    ian511
        13
    ian511  
       2019-01-23 10:30:44 +08:00 via iPhone
    Pragma 正解
    fromxt
        14
    fromxt  
       2019-01-23 10:31:42 +08:00
    @meik2333 sizeof(MyClass1); // 16 这个编译器已经做了自动数据对齐优化, 当一个 char 变量独立存在时,会分配一个 int 大小的空间。默认 4 字节对齐的话。至于你说编译器能自动把你的 MyClass1 优化成 MyClass2,这得靠写代码的人吧?字节对齐的主要目的是提高 CPU 访问数据的效率。例如,32 位 CPU 地址为 4 的倍数,一次内存访问就可以读出数据。
    lrxiao
        15
    lrxiao  
       2019-01-23 11:31:07 +08:00
    C/C++应该是标准要求不能优化

    Rust 是自动重排的,还有复用 invalid state(niche filling)的操作
    kljsandjb
        16
    kljsandjb  
       2019-01-28 22:12:34 +08:00 via iPhone
    从大到小写吧,对齐比较友好
    wingpui
        17
    wingpui  
       2019-02-03 02:35:21 +08:00
    @wizardoz
    @ian511
    正解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3458 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 11:39 · PVG 19:39 · LAX 03:39 · JFK 06:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.