强制 C++ 类具有不对齐的成员

问题描述 投票:0回答:2

考虑这个类:

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

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

c++ visual-studio c++11 visual-studio-2015
2个回答
2
投票

使用

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

以下简短示例演示了这一点:

#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等价的指令。

    


1
投票
#pragma pack

:

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

© www.soinside.com 2019 - 2024. All rights reserved.