C - alignas没有给出预期的结果

时间:2016-06-25 22:12:03

标签: c

C11中的{p> <f:be.container> <script src="{f:uri.resource(path:'js/jquery-2.1.4.min.js')}" type="text/javascript"></script> <script src="{f:uri.resource(path:'js/bootstrap.js')}" type="text/javascript"></script> <script src="{f:uri.resource(path:'js/jquery.tablesorter.min.js')}" type="text/javascript"></script> <!-- Chart JS --> <script src="{f:uri.resource(path:'js/Chart.min.js')}" type="text/javascript"></script> <link href="{f:uri.resource(path:'css/resultrepository.css')}" rel="stylesheet" type="text/css"/> <!-- Bootstrap --> <link href="{f:uri.resource(path:'css/bootstrap.min.css')}" rel="stylesheet"> <!-- Globales JavaScript für das Result Repository Modul --> <script src="{f:uri.resource(path:'js/rereGlobal.js')}" type="text/javascript"></script> <!-- JS for Noteverwaltung.html --> <script src="{f:uri.resource(path:'js/noteverwaltung.js')}" type="text/javascript"></script> <!-- FontAwesome --> <link href="{f:uri.resource(path:'css/font-awesome.min.css')}" rel="stylesheet"> 无法正常工作。这是我的代码:

Alignas

输出:

#include <inttypes.h>
#include <stdalign.h>
#include <stdio.h>

struct A
{
    alignas(int32_t) int16_t a;
    int16_t b;
};

struct B
{
    int16_t a;
    alignas(int32_t) int16_t b;
};

struct C
{
    int16_t a;
    int32_t b;
};

struct D
{
    int32_t a;
    int16_t b;
};

int main(void)
{
    printf("%zu, %zu\n", alignof(int16_t), sizeof(int16_t));
    printf("%zu, %zu\n", alignof(int32_t), sizeof(int32_t));
    printf("%zu, %zu\n", alignof(struct A), sizeof(struct A));
    printf("%zu, %zu\n", alignof(struct B), sizeof(struct B));
    printf("%zu, %zu\n", alignof(struct C), sizeof(struct C));
    printf("%zu, %zu\n", alignof(struct D), sizeof(struct D));
}

我预计所有这些结构的大小都是一样的。为什么2, 2 4, 4 4, 4 4, 8 4, 8 4, 8 struct A的大小不同?我误解了struct B的工作原理吗?

3 个答案:

答案 0 :(得分:5)

假设npm install --save react react-addons-pure-render-mixin 需要2字节对齐,int16_t需要4字节对齐。

int32_t

struct A { alignas(int32_t) int16_t a; int16_t b; }; 的自然布局为a 2字节,b为2字节,整个结构为2字节对齐。

但是alignas(int32_t)引入了额外的约束:a必须在4字节边界上对齐。这会强制整个结构在4字节边界上对齐。但是a的大小仍然只有2个字节,因此b可以在(4n + 2)字节边界之后立即放置,没有填充。在b的2个字节之后,我们在4n + 4上,即再次在4字节边界上。这意味着在b之后我们不需要填充:我们可以立即启动结构的另一个实例。

总而言之,我们有一个没有填充的结构(sizeof (struct A)是其成员大小的总和,4)和第一个成员的对齐,4。

struct B
{
    int16_t a;
    alignas(int32_t) int16_t b;
};

这里情况不同:a本身只强制2字节对齐。但是现在b必须在4字节边界上对齐,因此整个结构必须在4字节边界上对齐,并且在a之后插入2字节填充。到目前为止,我们有a的2个字节,填充的2个字节,b的2个字节,它们将我们置于(4n + 6)(即4n + 2)个字节边界。我们需要达到我们开始的状态,所以在b之后插入另外2个字节的填充,以确保我们以4字节边界结束。

总而言之,我们最终得到2 + 2字节的填充和2 + 2字节的内容,大小为8。

答案 1 :(得分:2)

您已指定b的{​​{1}}元素在4字节边界上对齐。由于B只需要2个字节,因此aa之间会产生2个字节的填充,b之后会产生另外2个字节,以使整个结构成为一个整数4个字节。

对于b,只有A具有4字节对齐(通过位于结构的开头)。 a没有额外的对齐要求,因此在没有填充之后立即执行,并且最后也不需要填充。

答案 2 :(得分:-1)

它们不同的原因是

sizeof 给出了存储其类型或实例所需的实际大小(以字节为单位)。

alignof 为您提供最大元素所需的字节对齐。