问题标签 [structure-packing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
226188 浏览

c - C中结构的大小

可能重复:
为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

考虑以下 C 代码:

输出是:

4 30 36

为什么结构的大小不等于其各个组件变量大小的总和?

0 投票
9 回答
1090 浏览

c++ - C++ 结构体大小:2+4+2+2+4 = 16

可能重复:
为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

为什么sizeof();这个结构的 16 字节?我正在用 g++ 编译。

0 投票
9 回答
9972 浏览

c++ - 带有 char、double、int 和 at 的结构的大小

当我只运行代码片段时

它给了我这样的结果:

总数:17。

但是当我测试包含这些数据类型的 sizeof 结构时,它给了我 24,我很困惑。额外的 7 个字节是什么?

这是代码

:编辑

我已经像这样更新了我的代码

现在它显示了 16 个字节。好不好,还是我丢失了一些重要的字节?

0 投票
10 回答
45003 浏览

c++ - C 结构中的内存对齐

我正在使用 32 位机器,所以我想内存对齐应该是 4 个字节。假设我有这个结构:

普通添加的大小是 6 个字节,我想对齐的大小应该是 8,但sizeof(myStruct)返回我 6。

但是,如果我写:

普通添加大小为 10 个字节,对齐大小应为 12,这次是sizeof(myStruct) == 12.

有人可以解释有什么区别吗?

0 投票
4 回答
2985 浏览

c++ - 将结构的成员声明为 uint32_t 时的额外字节

使用 stdint.h 库中的 uint32_t 类型时遇到问题。如果我运行以下代码(在 Ubuntu linux 11.10 x86_64,g++ 版本 4.6.1 上):

然后我得到以下输出:

我正在做的是打印出结构的总大小和结构的每个成员的大小。

在 xbee_tx_b 的情况下,成员的大小加起来就是结构的大小 (14)

在 xbee_tx_a 的情况下,成员的大小加起来为 18 个字节......但结构的大小是 20 个字节!

xbee_tx_a 和 xbee_tx_b 之间的唯一区别在于 dest_addr_64_X 成员的类型。它们是 xbee_tx_a 中的 uint32_t 和 xbee_tx_b 中的 uint16_t。为什么我使用 uint32_t 时结构的大小大于其成员大小的总和?那 2 个额外的字节是从哪里来的?

谢谢!

0 投票
5 回答
18485 浏览

c - Sizeof 运算符返回不正确的大小?

可能重复:
为什么结构的 sizeof 不等于每个成员的 sizeof 之和?
将结构的成员声明为 uint32_t 时的额外字节

出于某种原因,该sizeof运算符返回此结构的虚假大小(48而不是40):

所以这里是一个简单的测试:

哪个打印:

1 2 4 8:48

这是怎么发生的?如果你把所有的尺寸加在一起,你就得到了40,不是48。到底是48从哪里来的?

如果这是一些奇怪的x86-64特权,我如何确保结构的所有字段占据我希望它们占据的数量(我正在向这个结构投射一堆字节)?

0 投票
3 回答
3387 浏览

c - _int64 位字段

我需要在一个结构中使用一个 6 字节(48 位)位域,我可以将其用作无符号整数进行比较等。如下所示:

但不知何故,在 64 位 Windows 上,sizeof这个结构总是返回 8 个字节而不是 6 个字节。任何指针表示赞赏?

0 投票
6 回答
11448 浏览

c++ - 包含位域的结构的大小

可能重复:
为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

我试图理解位域的概念。但我无法找到为什么 CASE III 中以下结构的大小为 8 个字节。

案例一:

大小(b);// 输出:1(因为 unsigned char 在我的系统上占用 1 个字节)

案例二:

案例三:

我不明白为什么案例 III 的输出为 8。我期待 1(char) + 4(unsigned) = 5。

0 投票
2 回答
2501 浏览

opengl - 1 字节对齐与 4 字节对齐(像素打包)

我正在阅读 OpenGL 3.x 的 OpenGL SuperBible。我很难理解整个“像素包装概念”。我知道通常一个 199px 宽的图像需要 597 个字节 [(199 * 3)3 对于每个颜色通道 RGB]。我的第一个问题是为什么这只是有时是正确的,作者说这仅适用于 4 字节对齐系统。他接着说将添加额外的三个字节以使其容易被四整除,我也不明白。所以真的我的问题是 4 字节对齐的意义是什么——这实际上是什么意思?然后作者说替代方案是 1 字节对齐,我也不明白。

作者说 .TGA 是 1 字节对齐或“紧密”的,而 .bmp 是 4 字节对齐的。

什么是 4 字节对齐,1 字节对齐,为什么我应该使用一个而不是另一个?什么时候应该使用 .tga 或 .bmp 进行纹理处理?

0 投票
4 回答
645 浏览

c++ - 结构的大小如何随不同的数据类型而变化

我正在使用 Linux 32 位操作系统和 GCC 编译器。

我尝试了三种不同类型的结构。在第一个结构中,我只定义了一个char变量。这个结构的大小是1,这是正确的。

在第二个结构中,我只定义了一个int变量。这里结构的大小显示为 4 也是正确的。

但是在第三个结构中,当我定义一char和一时int,这意味着总大小应该是 5,但输出显示为 8。谁能解释一下结构是如何分配的?

输出:结构尺寸:1

输出:结构尺寸:4

输出:

结构尺寸:8