天道酬勤,学无止境

structure-packing

包含位域的结构的大小[重复](size of a structure containing bit fields [duplicate])

问题 这个问题在这里已经有了答案: 9年前关闭。 可能的重复: 为什么结构的 sizeof 不等于每个成员的 sizeof 之和? 我试图理解位域的概念。 但是我无法找到为什么 CASE III 中以下结构的大小显示为 8 个字节。 案例一: struct B { unsigned char c; // +8 bits } b; 大小(b); // 输出:1(因为 unsigned char 在我的系统上占用 1 个字节) 案例二: struct B { unsigned b: 1; } b; sizeof(b); // Output: 4 (because unsigned takes 4 bytes on my system) 案例三: struct B { unsigned char c; // +8 bits unsigned b: 1; // +1 bit } b; sizeof(b); // Output: 8 我不明白为什么案例 III 的输出是 8。我期待 1(char) + 4(unsigned) = 5。 回答1 您可以使用offsetof检查结构的布局,但它将遵循以下原则: struct B { unsigned char c; // +8 bits unsigned char pad[3]; //padding unsigned int bint; /

2021-11-25 13:27:52    分类:技术分享    c++   c   sizeof   bit-fields   structure-packing

size of a structure containing bit fields [duplicate]

This question already has answers here: Closed 9 years ago. Possible Duplicate: Why isn't sizeof for a struct equal to the sum of sizeof of each member? I was trying to understand the concept of bit fields. But I am not able to find why the size of the following structure in CASE III is coming out as 8 bytes. CASE I: struct B { unsigned char c; // +8 bits } b; sizeof(b); // Output: 1 (because unsigned char takes 1 byte on my system) CASE II: struct B { unsigned b: 1; } b; sizeof(b); // Output: 4 (because unsigned takes 4 bytes on my system) CASE III: struct B { unsigned char c; // +8 bits

2021-11-20 10:06:43    分类:问答    c++   c   sizeof   bit-fields   structure-packing

_int64 位域(_int64 bit field)

问题 我需要在一个结构中使用一个 6 字节(48 位)位域,我可以将其用作无符号整数进行比较等。以下内容: pack (1) struct my_struct { _int64 var1:48; } s; if (s.var >= 0xaabbccddee) { // do something } 但不知何故在 64 位 Windows 上,这个结构体的sizeof总是返回 8 个字节而不是 6 个字节。 任何指针表示赞赏? 回答1 您使用了_int64 ,因此sizeof返回 8。就像您决定用完可用 64 位中的 48 位一样。 即使我们声明这样的事情—— struct my_struct { _int64 var1:1; } s; 仍然sizeof会说 8。简而言之,位域的分配将根据位域的类型进行。 在这种情况下,它是_int64 ,因此分配了 8 个字节。 回答2 不幸的是,位字段具有底层类型的大小,在这种情况下 _int64 是 8 个字节。 由于我所知道的任何编译器中都没有六字节整数,因此您必须找到更好的方法。 一种是使用一个16位和一个32位值(或三个16位值)并编写自己的比较函数。 例如: struct my_struct { uint16_t high; uint32_t low } s; if ( (s.high > 0xaa) || ( (s.high ==

2021-10-31 19:43:30    分类:技术分享    c   struct   bit-fields   int64   structure-packing

_int64 bit field

I need to use a 6-byte (48-bit) bitfield in a structure that I can use as unsigned integer for comparison etc. Something along the following: pack (1) struct my_struct { _int64 var1:48; } s; if (s.var >= 0xaabbccddee) { // do something } But somehow on 64-bit Windows, sizeof this struct always returns 8 bytes instead of 6 bytes. Any pointers are appreciated?

2021-10-03 06:58:28    分类:问答    c   struct   bit-fields   int64   structure-packing

以符合标准的方式使用与数组相同类型的成员重新解释结构 [重复](Reinterpret struct with members of the same type as an array in a standard compliant way [duplicate])

问题 这个问题在这里已经有了答案: 将双数组转换为双精度结构6 个回答 3年前关闭。 在各种 3d 数学代码库中,我有时会遇到这样的事情: struct vec { float x, y, z; float& operator[](std::size_t i) { assert(i < 3); return (&x)[i]; } }; 其中,AFAIK 是非法的,因为允许实现在成员之间虚假添加填充,即使它们是相同的类型,尽管在实践中不会这样做。 通过static_assert s 施加约束可以使这合法吗? static_assert(sizeof(vec) == sizeof(float) * 3); 即是否未触发static_assert意味着operator[]执行预期的操作并且在运行时不调用 UB? 回答1 不,这是不合法的,因为将整数添加到指针时,以下适用 ([expr.add]/5): 如果指针操作数和结果都指向同一个数组对象的元素,或者数组对象的最后一个元素之后,求值不会产生溢出; 否则,行为未定义。 y占据了x末尾之后的内存位置(被视为具有一个元素的数组),因此定义了对&x加 1,但对&x加 2 是未定义的。 回答2 类型别名(对基本相同的数据使用不止一种类型)是 C++ 中的一个大问题。 如果您将成员函数保留在结构之外并将它们维护为 POD,那么事情应该可以正常工作

2021-06-27 02:10:17    分类:技术分享    c++   language-lawyer   strict-aliasing   type-punning   structure-packing

具有 char、double、int 和 at [重复] 的结构大小(Size of structure with a char, a double, an int and a t [duplicate])

问题 这个问题在这里已经有了答案: 为什么结构的 sizeof 不等于每个成员的 sizeof 之和? (12 个回答) 6年前关闭。 当我只运行代码片段时 int *t; std::cout << sizeof(char) << std::endl; std::cout << sizeof(double) << std::endl; std::cout << sizeof(int) << std::endl; std::cout << sizeof(t) << std::endl; 它给了我这样的结果: 1 8 4 4 总数:17。 但是当我测试包含这些数据类型的 sizeof struct 时,它给了我 24,我很困惑。 额外的 7 个字节是什么? 这是代码 #include <iostream> #include <stdio.h> struct struct_type{ int i; char ch; int *p; double d; } s; int main(){ int *t; //std::cout << sizeof(char) <<std::endl; //std::cout << sizeof(double) <<std::endl; //std::cout << sizeof(int) <<std::endl; //std::cout << sizeof

2021-06-23 11:49:30    分类:技术分享    c++   structure-packing

结构的大小如何随不同的数据类型而变化(how size of a structure varies with different data types)

问题 我正在使用Linux 32位操作系统和GCC编译器。 我尝试了三种不同类型的结构。 在第一种结构中,我仅定义了一个char变量。 此结构的大小是1,是正确的。 在第二种结构中,我仅定义了一个int变量。 此处结构的大小显示4也是正确的。 但是在第三个结构中,当我定义一个char和一个int ,意味着总大小应该为5,但输出显示为8。有人可以解释一下如何分配结构吗? typedef struct struct_size_tag { char c; //int i; }struct_size; int main() { printf("Size of structure:%d\n",sizeof(struct_size)); return 0; } 输出:结构尺寸:1 typedef struct struct_size_tag { //char c; int i; }struct_size; int main() { printf("Size of structure:%d\n",sizeof(struct_size)); return 0; } 输出:结构尺寸:4 typedef struct struct_size_tag { char c; int i; }struct_size; int main() { printf("Size of structure:%d\n"

2021-05-24 14:47:19    分类:技术分享    c++   c   structure   structure-packing

Extra bytes when declaring a member of a struct as uint32_t

I have a problem when using the uint32_t type from the stdint.h library. If I run the following code (on Ubuntu linux 11.10 x86_64, g++ version 4.6.1): #include "stdint.h" #include <iostream> using std::cout; typedef struct{ // api identifier uint8_t api_id; uint8_t frame_id; uint32_t dest_addr_64_h; uint32_t dest_addr_64_l; uint16_t dest_addr_16; uint8_t broadcast_radius; uint8_t options; // packet fragmentation uint16_t order_index; uint16_t total_packets; uint8_t rf_data[]; } xbee_tx_a; typedef struct{ // api identifier uint8_t api_id; uint8_t frame_id; uint16_t dest_addr_64_h; uint16_t

2021-05-10 21:53:37    分类:问答    c++   struct   sizeof   structure-packing

how size of a structure varies with different data types

I am using Linux 32 bit os, and GCC compiler. I tried with three different type of structure. in the first structure i have defined only one char variable. size of this structure is 1 that is correct. in the second structure i have defined only one int variable. here size of the structure is showing 4 that is also correct. but in the third structure when i defined one char and one int that means total size should be 5, but the output it is showing 8. Can anyone please explain how a structure is assigned? typedef struct struct_size_tag { char c; //int i; }struct_size; int main() { printf("Size

2021-05-08 20:07:20    分类:问答    c++   c   structure   structure-packing

C中struct的大小[重复](size of struct in C [duplicate])

问题 这个问题已经在这里有了答案: 11年前关闭。 可能重复: 为什么结构的sizeof不等于每个成员的sizeof之和? 考虑下面的C代码: #include <stdio.h> struct employee { int id; char name[30]; }; int main() { struct employee e1; printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1)); return(0); } 输出为: 4 30 36 为什么结构的大小不等于其各个组成变量的大小之和? 回答1 编译器可能会添加用于对齐要求的填充。 请注意,这不仅适用于结构的字段之间的填充,还可以适用于结构的末尾(这样,结构类型的数组将使每个元素正确对齐)。 例如: struct foo_t { int x; char c; }; 即使c字段不需要填充,该结构通常也将具有sizeof(struct foo_t) == 8 (在32位系统上-而是具有32位int类型的系统),因为需要c字段后的填充字节为3个字节。 请注意,系统可能不需要填充(例如x86或Cortex M3),但是出于性能原因,编译器可能仍会添加它。 回答2 如前所述,C编译器将添加填充以符合对齐要求。 这些要求通常与内存子系统有关。

2021-04-28 04:37:34    分类:技术分享    c   struct   structure-packing