【问题标题】:Does type alignment modify type size?类型对齐会修改字体大小吗?
【发布时间】:2015-09-30 19:48:37
【问题描述】:

我编写了以下代码并在 gcc 上进行了测试:

// firstly some platform-specific workarounds
#if _MSC_VER
#define ALN_BEGIN(x) __declspec(align(x)) 
#define ALN_END(x)
#define alignof(x) __alignof(x)
#else
#define ALN_BEGIN(x)
#define ALN_END(x) __attribute__((aligned(x)))
#define alignof(x) __alignof__(x)
#endif

// struct have three 4-byte members, but aligned at 32 byte
ALN_BEGIN(32) struct Foo
{
    float a;
    float b;
    float c;
} ALN_END(32);

// show its size and alignment
int main(int argc, char** argv)
{
    printf("size %d, alignment%d\n", sizeof(Foo), alignof(Foo));
}

当我使用 gcc 编译并运行它时,虽然 Foo 的所有成员只有 12 个字节,但sizeof(Foo) 得到了 32,这是对齐大小。那么扩容是按照语言标准(靠谱)还是只是GCC的一个特性?

我正在创建一个对象池类,所以我必须精确地处理类型大小和对齐方式。

【问题讨论】:

    标签: c++


    【解决方案1】:

    是的,这符合标准。 sizeof (X) 基本上定义为数组中两个连续 X 对象的起始地址之间的字节偏移量。如果这些对象由于对齐限制而不能紧密跟随,sizeof 会相应增加。

    引用 C++14、5.3.3/2:

    ... 应用时 对于一个类,结果是该类的对象中的字节数包括任何所需的填充 将该类型的对象放入数组中。 ... 应用时 对于数组,结果是数组中的总字节数。这意味着 n 数组的大小 元素的大小是元素大小的 n 倍。

    (强调我的)

    【讨论】:

      【解决方案2】:

      sizeof 的结果,对于任何类型(char 类型除外,根据定义其大小为1),是实现定义的,并受对齐的影响。但是,如果

      • sizeof(float)4;
      • 你的结构包含三个floats;和
      • 结构的开头和结尾都与 32 字节边界对齐。

      那么你可以期待你看到的行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-23
        • 2023-03-22
        • 2016-06-01
        • 2013-08-13
        • 2020-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多