C/C++,对于union的 size,普遍说法是,union的大小和其所包含的成员中size最大的members一致。
int main(void){
union u_tag {
char a[13];
int i;
}u;
printf("%d",sizeof(u));
return 0;
}
很快可以看出,此union中,其size最大的member是 char a[13],为 13 bytes。
但是其union的size 却是 16。
union在本质上是 variable。
The C programming language 写道
A union is a variable that may hold (at different times) objects of different types and sizes,
with compiler keeping track of size and alignment requirements
分析一个variable,需要不仅要分析其在内存中所占的大小,即 size,还要分析其在内存中的对齐方式,即 alignment。
union u最少需要分配需13 bytes的内存空间,这样才既可以存储char a[13],又有足够空间来存储 int i。
对任何一种 varaible都有 默认的alignment 要求,比如int型 的alignment是4 bytes,char是1 bytes. union也不例外,其alignment要和其成员中alignment值最大的成员保持一致。在上面的例子,union u的alignment需要和int i的alignment一致。即4 bytes.
所以union在分配13 bytes的 内存空间的同时,还需要在最后padding(填补) 3个无意义的bytes来满足 4-bytes的alignment的要求(size为4的整数倍)所以其size为16 bytes。
在内存中分析union时,只需要分析union中,所占size最大的成员和alignment值最大的成员,如定义所说的既要满足size requirement 又要满足 alignment requirement.
在
http://chuansu.iteye.com/blog/1487350这里对 data alignment以及struct size有很好的诠释。
int main(void){
union u_tag {
char a[13];
int i;
};
struct tt{
short d;
union u_tag u;
}t;
printf("%d",sizeof(t));
return 0;
}
struct t 的成员中包含 union u。 由于union u的alignment为4,在内存中,u与short d之间需要填补两个bytes来满足 union u的offset是 其alignment的整数倍。
最后需要看看struct内所有member的总size是不是为 此struct alignment的整数倍,在这里struct t的alignment就是union u的alignment(与其alignment值最大的成员保持一致).
所以最后结果为 sizeof(short d)+2 padding bytes +sizeof(union u)=20。
union与struct的区别
首先 union仅仅为一个variable 而struct则是 a collection of variables,是集合。
union在内存中,每一个成员或者variable都是起始于同一位置,或者说其所有的member的offset是一样的。这也是为什么union一次只能存储一个variable的原因。而struct中的成员显然不是。
引用
In effect, a union is a structure in which all memebers have offset zero from the base, the structure is big enough to hold the "widest" memeber and the alignment is appropriate for all of the types in the union.
分享到:
相关推荐
- **C库的调用**:当C++程序需要调用C语言编写的库时,需要使用 `extern "C"` 来避免名称修饰(name mangling)导致的链接错误。 - **跨语言调用**:在混合使用C和C++代码的情况下,`extern "C"` 可以确保C++编译器...
201 | [Bitwise AND of Numbers Range](https://leetcode.com/problems/bitwise-and-of-numbers-range/) | [C++](./C++/bitwise-and-of-numbers-range.cpp) [Python](./Python/bitwise-and-of-numbers-range.py) | _...
`extern "C"`的作用就是告诉C++编译器按照C语言的方式处理符号名称,通常用于声明C语言的函数和变量,以便在C++中正确地引用它们。 - **示例**: ```cpp extern "C" { int add(int a, int b); // 声明C语言的...
在C++中,`extern "C"`是用来告诉编译器以C语言链接约定来编译声明的函数或变量。这对于混合C和C++代码时尤为重要。 **2.1 extern "C"的作用** - **避免名称修饰**: 防止C++编译器对函数或变量名进行修饰,保持与...
本文详细介绍了嵌入式C/C++编程中的一些核心知识点,包括`struct`的深度应用、`extern "C"`的意义、C语言高效编程技巧以及成为一名嵌入式程序员所需掌握的基本问题。通过这些知识点的学习,可以更好地理解和掌握...
在Windows平台上进行C++或C编程时,遵循一定的编码规范尤为关键,因为这些规范能够帮助开发者避免潜在的陷阱,提高程序的稳定性和效率。以下是一些关于Windows平台下的C++/C编码规范的详细说明。 ## 1. 命名规则 ...
### 从C快速过渡到C++的关键知识点 #### 数据类型(DataType) 在从C语言过渡到C++的过程中,数据类型是理解两种语言差异的重要部分。C++不仅保留了C语言中的所有基本数据类型,还引入了一些更为复杂的数据类型...
### 嵌入式C/C++精华文章集锦概览 #### 1. C/C++语言struct深层探索 - **重要性**: 在嵌入式系统编程中,`struct` 是一种非常重要的数据组织方式,它允许程序员将不同类型的数据组合成一个整体。这种能力对于构建...
基于size的优化是指:当我们在指定由谁连接谁的时候,...基于size的代码: UnionFind3.h #ifndef UNION_FIND3_H_ #define UNION_FIND3_H_ #include #include namespace UF3 { class UnionFind { private: int* p
`sizeof`是C和C++中的一个非常重要的运算符,用于获取任何数据类型或变量在内存中占用的字节数。下面将详细讲解`sizeof`的用法。 1. `sizeof`与`strlen`的区别: - `strlen()`函数主要用于计算字符数组(字符串)...
而C++则是一种通用的、支持面向对象和泛型编程的静态类型语言,它源自C语言并添加了类、模板等特性。 1. 基本数据类型: - Delphi中的基本数据类型包括:Integer(整型),Cardinal(无符号整型),Byte,ShortInt...
C++是在C语言的基础上发展而来的,由Bjarne Stroustrup在贝尔实验室于1979年开始设计。 #### 二、C++语言基础知识 ##### 1. 数据类型 - **内置类型**:包括`void`、`char`、`short`、`int`、`long`、`float`、`...
10. **枚举(enum)**:C++中的枚举允许自定义类型,与C语言中的枚举有所不同,C++的枚举类型更安全,可以避免类型错误。 11. **自定义类型**:C++支持自定义结构体(struct)、联合(union)和枚举(enum)等类型...
相比C中的结构体,C++的类不仅包含数据,还可以有成员函数(方法),实现了数据的隐藏和行为的绑定,增强了代码的可维护性和安全性。 7. **联合(Union)**: - 联合是一种特殊的内存管理结构,它允许不同的数据...
摘要:VC/C++源码,游戏编程,扫雷 C语言扫雷源码,其实是模拟扫雷的游戏:union REGS regs; int size=15;/*用于表示每个方块的大小(正方形的边长)*/ int pix,piy=50;/*pix,piy是矩阵的偏移量*/ char b[2]="1...
- 示例:`typedef unsigned long size_t;`. **原则2.5 少用union** - `union` 的使用需谨慎,因为它可能导致意外的行为。 - 示例:`union Data { int i; float f; };`. **原则2.6 慎用位操作** - 位操作虽然高效,...