C++中结构体成员逐写与直接写对象的差异及代码实例疑问
C++结构体成员分别写入文件 vs 直接写入结构体对象的差异
首先直接给结论:示例中的两个文件数据完全不一致,而且两种写入方式的处理逻辑有本质区别,下面详细拆解:
一、两个指令的处理逻辑差异
指令1:myfile1 << obj.num1 << obj.abc;
这是C++标准库提供的格式化文本输出,本质是把数据转换成人类可读的字符串形式写入文件:
- 对于
int num1:会把整数的数值转换成对应的ASCII字符串,比如示例中obj是全局结构体,默认零初始化后num1=0,写入的就是字符'0'(ASCII码0x30)。 - 对于
char abc[10]:流输出会从数组首地址开始,逐个输出字符直到遇到'\0'(字符串结束符)为止。因为abc被零初始化全是'\0',第一个字符就是结束符,所以这部分不会输出任何内容。
最终example1.txt里只会有一个字符'0'。
指令2:myfile2.write((char*)&obj, sizeof(obj));
这是二进制原始字节写入,直接把结构体在内存中的完整布局原封不动地写入文件:
- 它不会做任何格式转换,直接读取
obj所在内存地址开始的sizeof(obj)个字节,这里有两个关键细节:- 内存对齐填充:C++编译器为了提升内存访问效率,会给结构体成员之间或末尾添加填充字节。比如你的
example结构体,int占4字节,char[10]占10字节,多数编译器会把总大小对齐到16字节(补2个填充字节,全局变量的填充值也是0)。 - 原始数据存储:
num1=0在内存中是4个连续的0字节;abc数组的10个字节全是0;再加上2个填充的0字节,总共16个字节会被完整写入example2.txt。
- 内存对齐填充:C++编译器为了提升内存访问效率,会给结构体成员之间或末尾添加填充字节。比如你的
二、扩展补充(常见场景差异)
即使给结构体成员赋值非零值,两种方式的差异依然明显:
- 比如
num1=123,abc="hello":指令1会写入字符串"123hello";指令2会写入4字节的123原始字节(比如0x7B 0x00 0x00 0x00)、"hello"的5个字节加5个'\0',再加上填充字节,总共16个原始字节。 - 二进制写入的文件是不可读的(文本编辑器打开会显示乱码),但读写速度更快,适合存储结构化数据;格式化写入的文件是文本格式,人类可读,但读写时需要做格式转换,效率更低。
内容的提问来源于stack exchange,提问作者Ashwin Balaji
相关产品推荐
相关产品推荐

