Any pitfalls using char* instead of void* when writing cross platform code?
当使用char*编写跨平台的内存访问代码时,是否存在任何缺陷?
更新:例如,如果地址与某个类型的大小对齐,我应该在将未引用的char*转换为某个类型(比如int)之前进行检查吗?某些架构会在未对齐的访问上返回奇怪的结果吗?
我正在研究一个播放内存分配器,以便更好地理解如何调试内存问题。我已经开始相信char*是更好的选择,因为它能够进行指针算术,并在void*上取消对它们的引用,这是真的吗?以下假设在不同的公共平台上是否始终正确?
1 2 3
| sizeof(char) == 1
sizeof(char*) == sizeof(void*)
sizeof(char*) == sizeof(size_t) |
- 除非你不引用char实例,否则你必须将char*和void*都强制转换成它们所指向的任何类型。
- 不知道它是否"有保证",但根据我的经验,前2个应该是安全的。最后一个…??
sizeof(char)==1绝对是正确的。
sizeof(char *) == sizeof(void *)也可能总是正确的。C标准要求它们具有相同的表示,这至少强烈地意味着相同的大小。
sizeof(char *) == sizeof(size_t)绝对不能依赖——我知道它是错误的实现(虽然它们可能不完全符合标准,但这不是它们的问题之一)。
- 谢谢杰瑞。您知道始终与指针大小相同的类型吗(指针类型除外:)?例如,在32位构建中应该是32位,在64位构建中应该是64位。我的印象是尺寸太大了。
- @UberMongoose:首先,注意甚至没有要求指针都是相同的大小。它们通常是,但不是必需的。在大多数典型的情况下,size_t也将是相同的,但同样不能保证(我知道至少有几个例外)。MS(例如)定义了一些类型,如int_ptr(一个与指针大小相同的整数),但这远不是通用的。也许你能做的最好的事情就是在配置头中使用typedef,这样当你到达一个需要修改的平台时,你就可以进行修改。
- 是什么意思?"以下类型指定了一个带符号的整数类型,该类型具有以下属性:任何指向void的有效指针都可以转换为此类型,然后再转换回指向void的指针,结果将与原始指针进行比较。"
- @啊,就是这样。很好的建议(我以前没有注意到)。
- 理论上,intptr_t是"可选的",但我还没有遇到它的缺失。
- @是的,所有的intxx_t(xx=32、64等)类型也是可选的——但是它们真正应该缺少的唯一地方是1的补码或有符号的数量级机器(两者都不常见)。
- @JerryCoffin——这不是1的补充,而是硬件中是否存在目标大小。因此,对于9位字节的硬件,没有int8_t。这就是为什么int_least8_t或int_fast8_t是更好的选择。
- @彼得贝克:理论上是的。然而,实际上,如果你看起来很努力的话,你至少可以罚一些1的补码机器。在博物馆外查找9位字节有点困难(尽管查找12位或16位字节并不那么困难)。
- 如果C标准要求它们具有相同的表示形式,那就更好了,这至少强烈地意味着相同的大小。解释(也许用引号)你所说的强烈暗示是什么意思?有歧义吗?