如何从比系统可寻址粒度更细的地址开始复制内存?
How to copy memory starting at address finer than the addressable granularity of your system?
我正在考虑 memcpy
,其中传递的 src
指针可能是一个奇数内存地址。这可能吗?并且,如果可以,是否可以实施?
如果对于我的系统,内存可以 32 位(4 字节)块寻址:
0x00001000
0x00001020
0x00001040
0x00001060
如何从内容从 0x00001000
开始的数组中的中间位置复制五个字节,例如地址 0x00001050
到 0x00001078
的内容?
memcpy
实现是否总是必须逐字节复制?
这在所有版本的 C 和所有平台上都能正常工作 - 如果 memcpy() 的参数需要字对齐,C 编译器将不符合 C 标准。
如果深入了解,您会发现如果 src 和 dst 是字对齐的,memcpy() 总是更快,并且需要特殊技巧来处理更一般的情况,例如奇数指针,因为它需要下降到字节级别。但这不是您的担心 - 您只需使用该功能并相信它会起作用。
我正在考虑 memcpy
,其中传递的 src
指针可能是一个奇数内存地址。这可能吗?并且,如果可以,是否可以实施?
如果对于我的系统,内存可以 32 位(4 字节)块寻址:
0x00001000
0x00001020
0x00001040
0x00001060
如何从内容从 0x00001000
开始的数组中的中间位置复制五个字节,例如地址 0x00001050
到 0x00001078
的内容?
memcpy
实现是否总是必须逐字节复制?
这在所有版本的 C 和所有平台上都能正常工作 - 如果 memcpy() 的参数需要字对齐,C 编译器将不符合 C 标准。
如果深入了解,您会发现如果 src 和 dst 是字对齐的,memcpy() 总是更快,并且需要特殊技巧来处理更一般的情况,例如奇数指针,因为它需要下降到字节级别。但这不是您的担心 - 您只需使用该功能并相信它会起作用。