最近看书总是遇到定义一个结构体,然后问你sizeof(此结构体)的值是多少?
本人看了看<<深入理解计算机系统>>一书,由做了些实验。总结一下:
1:
struct Foo{ int a; union U{ }u; }; int main() { printf("%d\n",sizeof(Foo)); system("pause"); return 0; }
输出:8
因为空的Union占一个字节。默认4字节对齐。
2:
#pragma pack(2) struct Foo{ int a; union U{ }u; }; int main() { printf("%d\n",sizeof(Foo)); system("pause"); return 0; }
这样要是指定是2字节对齐,那么输出结果就是2了。
3:
#pragma pack(2) struct Foo{ int a; union U{ }; }; int main() { printf("%d\n",sizeof(Foo)); system("pause"); return 0; }
注意这里有一个陷阱,union没有声明变量,只有一个定义。所以输出结果为:4(仅为int的字节数)
4:
struct Foo{ }; union E{ }; int main() { printf("%d\n",sizeof(struct Foo)); printf("%d\n",sizeof(union E)); system("pause"); return 0; }
这样的话,输出都为1。
结果:
1
1
5:
struct Foo{ union E{ }; }; int main() { printf("%d\n",sizeof(struct Foo)); //printf("%d\n",sizeof(union E)); system("pause"); return 0; }
结果:
1
反之将struct放进union中也是一样。甚至改成:
struct Foo{ }s; union E{ }e;
sizeof(e)和sizeof(s)也是1。
6:接下来言归正传,##pragma pack(n)有时候是会失效的(在n>struct成员占位最大的那个值的时候失效)。比如:
#pragma pack(4) struct Foo{ char a; char b; char v; }; int main() { printf("%d\n",sizeof(Foo)); system("pause"); return 0; }
因为,结构体最大的占位成员占1字节,所以#pragma pack(4)失效。按照1字节对齐,输出结果:
3
所以只有在n>struct成员占位最大的那个值的时候(对于数组结构,只取其一个元素所占的大小进行比较),#pragma pack(n)才会有效。
比如:
#pragma pack(4) struct Foo{ double b; char a; char c; }; int main() { printf("%d\n",sizeof(Foo)); system("pause"); return 0; }
运行结果是:
12
7:函数和类型重定义不占空间,比如:
struct Foo{ void foo(int a){} //不带分号 typedef int INT; //带分号 }; int main() { printf("%d\n",sizeof(Foo)); system("pause"); return 0; }
结果:
1
8:enum的声明是不占字节的。enum变量占四个字节。
struct Foo{ enum Color{a,b} f; }; int main() { printf("%d\n",sizeof(struct Foo)); system("pause"); return 0; } //结果 4
struct Foo{ enum Color{a,b}; }; int main() { printf("%d\n",sizeof(struct Foo)); system("pause"); return 0; } //结果 1
enum Kala{fa,faa,faaa}; int main() { printf("%d\n",sizeof(enum Kala)); system("pause"); return 0; } //结果 4
9:好了先到这里,看一个题:
猜猜下面sizeof(Foo)输出多少?
#pragma pack(2) struct Foo { int i; union U { char buff[13]; int i; }u; void foo() { } typedef char* (*f)(void*); enum{red, green, blue} color; }; int main() { printf("%d\n",sizeof(struct Foo)); system("pause"); return 0; } //结果: 22(4+13+1+4)
相关推荐
sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐是C语言中一个重要的概念,它们之间存在着紧密的联系。sizeof(结构体)是指结构体在内存中的大小,而内存对齐是指编译器为了提高程序的效率和可移植性,对内存...
sizeof与结构体和共同体.PDF 特别特别难找的一本书,不下会后悔的
sizeof进行结构体大小的判断.sizeof进行结构体大小的判断.sizeof进行结构体大小的判断.
通过深入理解`sizeof`和`struct`结构体的内存对齐,开发者可以更好地控制内存使用,避免潜在的性能瓶颈,并优化代码的移植性。在实际编程中,尤其是涉及网络通信、数据序列化或硬件交互时,结构体的内存布局就显得尤...
// 将结构体的起始地址进行强制转型,传入起始地址,用sizeof函数求出结构体的大小。} 这个算法比较简单,也没什么含量。但是希望大家有什么好的算法,也分享出来给大家,大家一起学习进步。
这可能会影响到结构体的实际大小,可以通过 sizeof 操作符来获取结构体所占的字节数。 例如,我们可以这样显示 `Student` 结构体的大小: ```c #include int main() { printf("Size of struct Student: %ld ...
void* p2 = malloc(sizeof(struct GPIO_TypeDef)); struct GPIO_TypeDef *p1 = (struct GPIO_TypeDef *)p2; ``` 2. **在STM32中的应用**:在STM32的开发中,可能会遇到需要从一个地址读取GPIO外设信息的情况。...
IntPtr intptr = Marshal.AllocHGlobal(Marshal.SizeOf(vga)); Marshal.StructureToPtr(vga, intptr, true); // 将结构体复制到非托管内存 // 在此发送 intptr 指针给目的方 Marshal.FreeHGlobal(intptr); // 释放...
`sizeof`也可以用于结构体或联合体类型。当应用于结构体时,它会返回整个结构体所占用的内存大小。结构体的大小是其所有成员大小之和,加上可能的对齐填充。例如: ```c struct MyStruct { char c; int i; }; ...
注意,读取的数据量应该与写入时相同,即`sizeof(结构体类型)`: ```cpp Student s; inFile.read(reinterpret_cast*>(&s), sizeof(s)); ``` 读取多个结构体时,同样用循环来遍历文件: ```cpp while (inFile.read...
### 三、示例代码分析 #### 示例代码: ```c // 定义结构体类型 typedef struct { uint8_t uint8_t_d; uint16_t uint16_t_d; uint32_t uint32_t_d; int8_t int8_t_d; int16_t int16_t_d; int32_t int32_t_d;...
### C++ `sizeof` 使用规则及陷阱分析 #### 一、`sizeof` 概念介绍 在C++中,`sizeof` 是一个关键字,用于获取变量或类型(包括聚合类型)所占用的存储空间大小(以字节为单位)。这个关键字返回一个 `size_t` ...
i < sizeof(stus) / sizeof(struct stu); i++) { printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", ps[i].name, ps[i].num, ps[i].age, ps[i].group, ps[i].score); } ``` 以上就是C语言中关于...
`sizeof`运算符用于获取结构体或变量在内存中占用的字节数,这对于内存管理、计算数组大小等操作非常有用。例如`sizeof(struct cat)`会返回`cat`结构体的总大小。 7. **结构体变量赋值**: 同类型的结构体变量...
在实际编程中,我们可以通过预处理器宏来获取结构体的大小,例如在C/C++中使用`sizeof`运算符: ```c printf("Size of MyStruct: %zu\n", sizeof(struct MyStruct)); ``` 这将输出结构体`MyStruct`的实际大小,包括...
这里使用了`Marshal.SizeOf`计算结构体的大小,并通过`Marshal.StructureToPtr`将结构体复制到内存的字节数组中。 3. **字节数组转结构体**:创建一个方法将字节数组还原为结构体。 ```csharp public static ...
在 C 语言中,sizeof 运算符可以应用于变量、数组、结构体、联合体、枚举类型等各种数据类型。sizeof 运算符的结果是变量或类型的大小,以字节为单位。 在结构体中,sizeof 不是成员类型大小的简单相加。计算结构体...
struct Student* s1 = (struct Student*)malloc(sizeof(struct Student)); s1->name = "张三"; s1->age = 20; s1->score = 90.5; ``` 这里使用 `malloc` 函数动态地为 `Student` 结构体分配内存。记得在不再需要...
int size = Marshal.SizeOf(myStruct); byte[] bytes = new byte[size]; GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { IntPtr ptr = handle.AddrOfPinnedObject(); Marshal....
本文将对 sizeof 操作符进行详细的总结,包括其定义、语法形式、基本数据类型的 sizeof 值、指针变量的 sizeof 值、数组的 sizeof 值、结构体的 sizeof 值等。 定义和语法 sizeof 操作符的定义是:The sizeof ...