64位 内存对齐问题

njkido 2010-12-01 02:43:09
MSDN中的一段话:

On 64-bit Windows, if a data structure is misaligned, routines that manipulate the structure, such as RtlCopyMemory and memcpy, will not fault. Instead, they will raise an exception. For example:

Copy

#pragma pack (1) /* also set by /Zp switch */
struct Buffer {
ULONG size;
void *ptr;
};

void SetPointer(void *p) {
struct Buffer s;
s.ptr = p; /* will cause alignment fault */ //为什么这里有问题?
...
}

You could use the UNALIGNED macro to fix this:

Copy

void SetPointer(void *p) {
struct Buffer s;
*(UNALIGNED void *)&s.ptr = p;
}

Unfortunately, using the UNALIGNED macro is very expensive on Itanium-based processors. A better solution is to put 64-bit values and pointers at the beginning of the structure.

问题:
s.ptr = p;有什么问题?
我的理解是:原来64位是8字节对齐,现在#pragma pack (1)后就不会在size后填充4个字节,s.ptr = p;中“.”操作仍然会从s地址的第8个字节开始读,造成错误。不知道MSDN是不是这个意思?求教~
...全文
580 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mymtom 的回复:]

ptr是指针,需要8字节对齐,没有对齐的内存访问,在64位Windows上会引起异常。
不是.操作的问题,而是=的问题。
s.ptr = p
这个赋值将造成一个未对齐的内存写操作,会引起异常。
[/Quote]
正解
64位下,指针大小就是64位,8字节
东大坡居士 2010-12-01
  • 打赏
  • 举报
回复
64位下指针已经是8位的了
bluewanderer 2010-12-01
  • 打赏
  • 举报
回复
毕竟不对齐在CISC上也好过不到哪儿去x.x
2010-12-01
  • 打赏
  • 举报
回复
貌似这句话说的是 IA-64,不是 x86-64……
mymtom 2010-12-01
  • 打赏
  • 举报
回复
ptr是指针,需要8字节对齐,没有对齐的内存访问,在64位Windows上会引起异常。
不是.操作的问题,而是=的问题。
s.ptr = p
这个赋值将造成一个未对齐的内存写操作,会引起异常。


赵4老师 2010-12-01
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
njkido 2010-12-01
  • 打赏
  • 举报
回复
32位上试了下 ptr地址如果不在4的整数倍上 s.ptr也正常
bluewanderer 2010-12-01
  • 打赏
  • 举报
回复
64位环境下地址都是64位的,这里是s.ptr本身没有对齐在8字节上。

至于到底不对齐会怎么样不知道,从来没那么干过。数据对齐是一种美德x.xb

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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