struct(结构体)是一种复合数据类型,其构成元素既可以是如int、long这样的基本数据类型,也可以是一些复合数据类型,如struct等。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构体的地址相同。对于结构体,编译器会自动按其自然对齐条件分配空间。数据对齐方便了数据的查询,因为指针的偏移有一定的规律,但是这是以占有更多的内存空间为代价的。
1. 对齐
指元素存放在内存中的起始地址偏移量(1,2,4,...)。例如int类型的偏移量应该是sizeof(int)。
2. struct自然对齐
-
元素对齐 :按照元素类型的size进行。(个人理解,元素对齐亦即结构体内部的对齐方式。在结构体内部的连续空间,按类型的size寻址。)
-
整体对齐 : 按照结构体中size最大元素进行。( 个人理解,整体对齐亦即结构体外部的对齐方式,相当于把结构体作为一种复杂数据类型来考虑,结构体所占内存是最大元素size的倍数。)
3.指定对齐
#pragma pack(num)
#pragma pack() 取消对齐
- 元素对齐 :按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行;
- 整体对齐 :按照结构体最大的数据成员和#pragma pack指定值之间,较小的那个进行。
4.struct的成员是struct
例如,struct A{
struct B;
}
对齐以B中最大元素长度为准,如示例里的NODE_D和NODE_E,因为NODE_C中最大元素size是4,所以NODE_D和NODE_E的大小均为16.
示例:
#include <iostream>
using namespace std;
typedef struct
{
int b;
char c;
short a;
int d;
}NODE_A;
typedef struct
{
char c;
int b;
short a;
int d;
}NODE_B;
typedef struct
{
int a;
int b;
char c;
}NODE_C;
typedef struct
{
int a;
NODE_C c;
}NODE_D;
typedef struct
{
char a;
NODE_C c;
}NODE_E;
int main(){
cout << "sizeof(int) , sizeof(short), sizeof(char) : "
<< sizeof(int) << ", " << sizeof(short) << ", " << sizeof(char) << endl;
cout << "sizeof(NODE_A) : " << sizeof( NODE_A ) << endl;
cout << "sizeof(NODE_B) : " << sizeof( NODE_B ) << endl;
cout << "sizeof(NODE_C) : " << sizeof( NODE_C ) << endl;
cout << "sizeof(NODE_D) : " << sizeof( NODE_D) << endl;
cout << "sizeof(NODE_E) : " << sizeof( NODE_E) << endl;
/*
Execution Result
sizeof(int) , sizeof(short), sizeof(char) : 4, 2, 1
sizeof(NODE_A) : 12
sizeof(NODE_B) : 16
sizeof(NODE_C) : 12
sizeof(NODE_D) : 16
sizeof(NODE_E) : 16
*/
return 0;
}
分享到:
相关推荐
本文将详细地介绍C语言中struct的大小、首地址和内存对齐问题,以及不同的编译器和微处理器平台对struct的处理方式。 首先,对于处理器,大尾端、小尾端的因素必须考虑。在ANSI C标准中,并没有规定相邻声明的变量...
C语言字节对齐问题详解 C语言中的字节对齐问题是指在编译器将C语言程序编译成机器代码时,对变量的存储方式进行调整,以提高存取效率和减少存储空间。字节对齐是指在内存中将变量按照一定的规则排列,以便在访问...
- `alignof`运算符可以查询类型或变量的对齐要求,这对于理解和调试内存对齐问题很有帮助。 7. **结构体嵌套和数组的影响**: - 当结构体包含其他结构体作为成员时,子结构体会按照自己的对齐规则对齐,这可能...
2,对于struct,对齐的大小也是最大的基本元素的对齐大小,对象的大小需要考虑元素的对齐,并且需要是最大基本元素的整数倍;同时有#pragma pack修饰的情况,关于struct请详细参考另外一个帖子。 3,这里所说的...
在C语言中,`sizeof`运算符用于计算数据类型或者变量在内存中占用的字节数。...因此,这个文档“sizeof求struct大小内存对齐问题.docx”很可能是详细讲解了这些概念和实践案例,帮助读者更深入地理解和应用这些知识点。
首先看一下结构体对齐的三个概念值: 数据类型的默认对齐值(自身对齐): 1.基本数据类型:为指定平台上基本类型的长度。如在32位机器中,char对齐值为1,short为2,int,float为4,double为8; 结构体:其数据成员...
Struct 占用内存空间的计算规则是编译器根据 CPU 的存取机制和对齐参数来确定的。下面是 Struct 占用内存空间的计算规则: 1. 每个成员按其类型大小和指定对齐参数 n 中较小的一个进行对齐 2. 确定的对齐参数必须...
对齐问题是指编译器为了提高 CPU 的存储速度,将变量存储的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。 在 VC 中,对结构体的成员变量的存储顺序是按照成员变量出现的顺序依次...
# 改变结构体成员的字节对齐 ## 例子 #include typedef struct { char a; int b; } ST_A;
在C++编程中,结构体(struct)字节对齐是一项重要的优化技术,它涉及到内存管理、性能优化以及跨平台兼容性。字节对齐是指在内存中安排数据...在实际开发中,应该尽量让编译器自动处理字节对齐问题,除非有特殊需求。
在提供的代码文件中,`structMemory.cpp`很可能是实现和展示结构体内存对齐问题的示例。它可能包含了不同结构体定义,通过比较它们的`sizeof`结果来揭示对齐规则的影响。其他如`StdAfx.cpp`、`StdAfx.h`等文件是...
1. 数据成员对齐规则:结构体(struct)或联合(union)的数据成员,第一个数据成员放在 offset 为 0 的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是...
结构体字节对齐规则,主要是介绍结构体字节对齐规则,内容有点长,但是很全面.
4. 数据成员、结构体和类的有效对齐值:这是数据类型自身的对齐值和指定对齐值中的较小者。 有效对齐值N意味着数据必须按照N字节对齐。如果结构体的有效对齐值为N,那么结构体的起始地址必须是N的倍数。结构体成员...
通常,我们写程序的时候,不需要考虑对齐问题。编译器会替我们选择适合目标平台的对齐策略。当然,我们也可以通知给编译器传递预编译指令而改变对指定数据的对齐方法。 算法: 对齐的算法是指编译器对 struct 数据...
通常情况下,编写程序时无需手动处理对齐问题,编译器会自动选择适合目标平台的对齐策略。然而,当遇到诸如`struct`类型数据的`sizeof`结果出乎预料的情况时,理解对齐机制变得至关重要。 以GCC 3.2.2版本(32位x86...
本文将围绕“VS C++字节对齐方式”这一主题展开讨论,通过对示例代码的分析来探讨Visual Studio环境下C++语言如何处理字节对齐问题,以及程序员应如何合理利用编译器特性来优化代码性能。 #### 二、字节对齐的基本...
### C++内存中字节对齐问题详解 #### 一、什么是字节对齐,为什么要对齐? 在C++及其它编程语言中,字节对齐(Byte Alignment)是指数据在内存中的排列方式,它遵循特定的规则,使得数据结构中的每个元素能够在其...