这样的结构体,是否有内存对齐的问题

whoho 2006-03-31 07:41:59
struct ST
{
char a[13];
char b[5];
char c[11];
};

类似这样的结构体,也就是说,如果结构体的每个成员都是字符数组,
那么编译器是否会进行内存对齐的优化?

之所以这么问是因为,我现在碰到的一个别人写了大半儿的程序里面,
把这样的数组通过socket原样发出去了,我不知道这在另外一端会不会被错误地解释?
(另外那一端也使用在源代码上完全一致的结构体定义)
...全文
458 25 打赏 收藏 转发到动态 举报
写回复
用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)

64,664

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧