关于struct的内存地址分配问题

本文探讨了struct在内存中的分配方式,通过实验分析了struct中不同类型的成员变量如何存储。在32位环境下,struct占用12字节,其中short1占用2字节,char1占用4字节,arrshort占用4字节,而enum1作为常量没有内存地址。编译器使用数据对齐策略,使得short1后面填充了2字节以达到4字节对齐。此外,文章还比较了32位和64位环境下,基本数据类型、指针和结构体的内存差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直对内存地址的分配有些疑惑,故做实验研究一下:

先定义一个Struct,里面包含一个enum,一个short,一个char*存放字符串,一个short*存放short数组。

typedef struct MyStruct
{
	enum MyEnum {
		enum1, enum2, enum3, enum4
	};
	short short1;
	char * char1;
	short * arrshort;
}*PtrMyStruct;

之后定义一个类,里面的private成员变量定义该struct,并加入两个简单的方法永远设置和相关显示:

class myClass
{
private:
	MyStruct mystruct;
public:
	myClass();
        ~myClass();
	void setMyStruct();
	void showStructInfo();
};

实现具体函数

void myClass::setMyStruct()
{
	PtrMyStruct ptrmystruct = &mystruct;
	ptrmystruct->char1 = "hello,this is test";
	ptrmystruct->short1 = 125;
	ptrmystruct->arrshort = new short[4]{4, 32, 21, 57};

};

void myClass::showStructInfo()
{
	PtrMyStruct ptrmystruct = &mystruct;
	cout <&
### C/C++ Struct 内存分配方式及规则 #### 1. 内存对齐基本原则 在C/C++中,编译器为了提高访问速度会对结构体成员按照一定的规则进行内存对齐。通常情况下,每个数据类型的起始地址相对于其偏移量应该是该类型大小的倍数[^1]。 #### 2. 数据成员排列顺序影响 当定义一个包含不同类型字段的结构体时,如果这些字段不是按它们自然边界(即各自的数据宽度)依次递增的方式声明,则可能会因为填充字节而使整个结构占用更多空间。例如,在`struct C{char a; int b; char c}`中,由于`int`需要四字节对齐,所以在`a`之后会插入三个未使用的字节来满足这一条件;同样地,在`c`之前也会有三字节空白区域用于保持整体布局规整性。 ```cpp #include <iostream> struct C { char a; int b; char c; }; int main() { std::cout << "Size of struct C: " << sizeof(C) << " bytes\n"; } ``` 这段程序展示了如何通过`sizeof()`操作符获取给定结构的实际尺寸,并打印出来验证上述理论描述的结果是否正确——对于大多数平台而言应为12个字节。 #### 3. 类型特定调整策略 不同长度的基础类型有着各自的默认对齐需求:字符(`char`)只需一字节即可存储,因此不需要额外处理;而对于像双精度浮点数(`double`)这样较大且复杂度较高的对象则可能涉及到更严格的约束机制以确保高效读写性能[^2]。 #### 4. 编译期优化选项作用 某些时候开发者可以通过预处理器指令或编译参数改变默认行为,比如GCC支持使用属性(attribute)指定自定义对齐程度,或是MSVC允许借助#pragma pack命令控制打包紧密度从而减少不必要的浪费现象发生[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值