<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
的工作原理吗?
答案 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个字节,因此a
和a
之间会产生2个字节的填充,b
之后会产生另外2个字节,以使整个结构成为一个整数4个字节。
对于b
,只有A
具有4字节对齐(通过位于结构的开头)。 a
没有额外的对齐要求,因此在没有填充之后立即执行,并且最后也不需要填充。
答案 2 :(得分:-1)
它们不同的原因是
sizeof 给出了存储其类型或实例所需的实际大小(以字节为单位)。
alignof 为您提供最大元素所需的字节对齐。