社区
C++ 语言
帖子详情
这样的结构体,是否有内存对齐的问题
whoho
2006-03-31 07:41:59
struct ST
{
char a[13];
char b[5];
char c[11];
};
类似这样的结构体,也就是说,如果结构体的每个成员都是字符数组,
那么编译器是否会进行内存对齐的优化?
之所以这么问是因为,我现在碰到的一个别人写了大半儿的程序里面,
把这样的数组通过socket原样发出去了,我不知道这在另外一端会不会被错误地解释?
(另外那一端也使用在源代码上完全一致的结构体定义)
...全文
458
25
打赏
收藏
这样的结构体,是否有内存对齐的问题
struct ST { char a[13]; char b[5]; char c[11]; }; 类似这样的结构体,也就是说,如果结构体的每个成员都是字符数组, 那么编译器是否会进行内存对齐的优化? 之所以这么问是因为,我现在碰到的一个别人写了大半儿的程序里面, 把这样的数组通过socket原样发出去了,我不知道这在另外一端会不会被错误地解释? (另外那一端也使用在源代码上完全一致的结构体定义)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
roger_77
2006-04-03
打赏
举报
回复
楼主理解能力比我好.
whoho
2006-04-03
打赏
举报
回复
"在应用自编程":这句话说得很在理
其实在提这个问题的时候,我大致也知道了答案会是什么样的结构
有时候人的某些简单经验可能相当有用,就说这个全是字符数组的结构的对齐问题,
也许在很多比较有“经验”的人那里,已经有了一个“肯定没有对齐”的结论。
但经验却往往带着风险。对经验的自信使得这种并不完全可靠的假设遍及系统的
各个角落,你想改也望码兴叹。如果将来真有我们用到的某个编译器发生差别了,
那么那时候就要动大手术了。
讨论到这里,我可以大致总结:也许,只是也许,主流的好几个编译器都不对
这样的结构采用对齐优化,但我们无法保证所有的编译器都是这样。尤其,当
我的这样的结构需要直接通过网络传播时。
庄鱼
2006-04-02
打赏
举报
回复
这种结构本身并不存在对齐,再传输与文件操作时,首先要保证双方采用相同的约定,由于系统在文件操作时通常是采用字节方式,即单字节对齐,因此在提供此类读写操作的接口函数时,尽量考虑采用单字节对齐方式。
如果存在网络传输、跨语种数据通信,则有必要将整个结构都改成数据流方式或字节数组,这样便于有效的保证数据读写的一致性。
liusujian02
2006-04-01
打赏
举报
回复
IAP: Internet Access Provider
因特网接入提供者
roger_77
2006-04-01
打赏
举报
回复
帮顶一下。
这种字节对齐的问题。你在VC中把项目中的setting->c/c++/struct member aligment改成1 Bytes。
或者加上项目中都使用"#pram pack(1)"编译。
gr8_bug
2006-04-01
打赏
举报
回复
如果你把一个类型的对象,如一个结构体,用另一种类型的对象的格式进行存储或传送,如楼主所述,是按照连续的字节陈列进行传送,当对方把接收到的字节陈列恢复为结构体时,就会遇到这样的问题。
解决的办法或许是这样:集合的每个元素在传送或存储时都处于确定的位置,双方的理解就不会出现差异。这其实是协议的问题。
省事的办法有时是行不通的。
toumao
2006-04-01
打赏
举报
回复
内存对齐优化在VC里默认是4字节,
也就是说你苦不指定,就按4字节对齐,
用socket直接发出去也未尝不可,只要接收方也用4字节来解释。
如果发送软件和接收软件是同一伙人做的,在同样的系统下编译的,就好办了。
否则,通信双方要约定对齐方式的,
不同的公司之间通信,多数就是直接pack(1)的。
findcsdn
2006-03-31
打赏
举报
回复
我理解数据对齐只对简单数据类型有效。
文中的那种定义方法用于通讯没有问题。
Jiana
2006-03-31
打赏
举报
回复
内存对齐
不会被错误地解释
roger_77
2006-03-31
打赏
举报
回复
楼主呀。
我也一直很关注这问题,
goodluckyxl
2006-03-31
打赏
举报
回复
是我用的平台的一个术语吧
通俗的说的 在应用自编程
pure_baby
2006-03-31
打赏
举报
回复
结构体应该不会出现对齐的现象!在共用体中倒是有地址对齐的现象!
皮皮鲁
2006-03-31
打赏
举报
回复
至少在VC编译器中,这样绝对是没有问题的,因为你结构中最大的 粒度 为1
littlegang
2006-03-31
打赏
举报
回复
网络传输,建议按1字节对齐
#pragma pack(1)
firetoucher
2006-03-31
打赏
举报
回复
>类似这样的结构体,也就是说,如果结构体的每个成员都是字符数组,
>那么编译器是否会进行内存对齐的优化?
首先,这要看你所用的编译器。会或者不会都有可能
其次,你提到数组。如果是struct的数组的话。几乎肯定会有问题。因为有些编译器为了数组效率,会在strcut后面(或者其他地方)添加padding,使结构的大小是4或者其他寻址单位的整数倍。
FT
--
Anything one man can imagine, other men can make real.
liusujian02
2006-03-31
打赏
举报
回复
记录一下位置
whoho
2006-03-31
打赏
举报
回复
单纯的对齐问题我大体知道怎么回事,不过我这里问的是,*全部*字符数组**
作为成员的结构体会不会有问题????????
希望不吝赐教
whoho
2006-03-31
打赏
举报
回复
多谢多谢
不过尚要请教IAP为何物
roger_77
2006-03-31
打赏
举报
回复
编译器会进行内存对齐的优化。这在VC编译器中是肯定的。
但结构体传输赋值问题,我也碰到了,也发了帖子,请看:
http://community.csdn.net/Expert/topic/4633/4633993.xml?temp=.8620722
问题是解决了,理论上还不是很明白。
goodluckyxl
2006-03-31
打赏
举报
回复
照我的意见 肯定会出问题
我在两种情况下遇到过
1. 数据通讯
2. IAP时
加载更多回复(5)
sizeof(
结构体
)和
内存对齐
sizeof(
结构体
)和
内存对齐
sizeof(
结构体
)和
内存对齐
sizeof(
结构体
)和
内存对齐
sizeof(
结构体
)和
内存对齐
结构体
大小-详解
内存对齐
问题
该文档提供了详细解决
结构体
sizeof
问题
,从
结构体
内变量所占空间大小,默认
内存对齐
大小,强制
内存对齐
方法,变量在内存中布局的详细分析,语言言简意赅,绝无废话,为读者解决了大量寻找书籍的烦恼,读者可以花费几分钟的时间解决掉
结构体
内存对齐
的所有
问题
,以后也便于查找和回忆.
关于
结构体
的
内存对齐
关于
结构体
的
内存对齐
关于
结构体
的
内存对齐
关于
结构体
的
内存对齐
结构体
联合体之
内存对齐
仔细分析,仔细琢磨,必有收获。
C语言
结构体
内存对齐
问题
.pdf
C语言
结构体
内存对齐
问题
.pdf
C++ 语言
64,664
社区成员
250,488
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章