【问题标题】:Force a C++ class to have aligned attributes强制 C++ 类具有对齐的属性
【发布时间】:2020-06-30 10:32:22
【问题描述】:

考虑这个类:

class C3
{
public:
    uint16_t p1;
    uint16_t p2;
    uint8_t p3;
};

sizeof(C3)6。是否有任何编译器例程可以绕过对齐并强制其大小为5?我尝试使用alignas 没有成功...

【问题讨论】:

标签: c++ c++11 visual-studio-2015


【解决方案1】:

使用MSVC 编译器(您已包含VS-2015 标记),您可以使用#pragma pack 指令为类和结构设置填充选项。这还允许您使用 pushpop 选项保存/恢复“默认”设置。

下面的简短示例演示了这一点:

#include <iostream>

class C3 {
public:
    uint16_t p1;
    uint16_t p2;
    uint8_t p3;
};

#pragma pack(push, 1) // Save current packing and set to single-byte
class C4 {
public:
    uint16_t p1;
    uint16_t p2;
    uint8_t p3;
};
#pragma pack(pop) // Restore saved packing

class C5 {
public:
    uint16_t p1;
    uint16_t p2;
    uint8_t p3;
};

int main()
{
    std::cout << sizeof(C3) << std::endl; // 6
    std::cout << sizeof(C4) << std::endl; // 5
    std::cout << sizeof(C5) << std::endl; // 6 (again)
    return 0;
}

许多其他编译器支持等效到 MSVC #pragma pack 的指令。

【讨论】:

    【解决方案2】:

    与 Adrian 的回答类似,您也可以为某些可能不支持 #pragma pack 的编译器执行此操作:

    class  C3
    {
    public:
        uint16_t p1 __attribute__((packed));
        uint16_t p2 __attribute__((packed));
        uint8_t p3;
    };
    

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      相关资源
      最近更新 更多