【问题标题】:Any pitfalls using char* instead of void* when writing cross platform code?编写跨平台代码时使用 char* 而不是 void* 有什么陷阱吗?
【发布时间】:2012-10-24 04:57:27
【问题描述】:

在使用 char* 编写跨平台的内存访问代码时有什么陷阱吗?

更新:例如,如果地址与该类型的大小对齐,我应该在将取消引用的 char* 转换为某种类型(例如 int)之前检查吗?某些架构会在未对齐访问时返回奇怪的结果吗?

我正在开发一个播放内存分配器,以更好地了解如何调试内存问题。我开始相信 char* 更可取,因为它能够进行指针运算并取消对 void* 的引用,这是真的吗?以下假设在不同的常见平台上是否始终成立?

sizeof(char) == 1
sizeof(char*) == sizeof(void*)
sizeof(char*) == sizeof(size_t)

【问题讨论】:

  • 除非您取消引用 char 实例,否则您将不得不将 char*void* 转换为它们指向的任何类型。
  • 不知道它是否“保证”,但根据我的经验,前两个应该是安全的。最后一个……??。

标签: c++ pointers cross-platform


【解决方案1】:

sizeof(char)==1 绝对是真的。

sizeof(char *) == sizeof(void *)可能也总是正确的。 C 标准要求它们具有相同的表示形式,这至少强烈暗示了相同的大小。

sizeof(char *) == sizeof(size_t) 绝对不能依赖——我知道它是错误的实现(虽然它们可能不完全符合标准,但这不是他们的问题之一)。

【讨论】:

  • 谢谢杰瑞。你知道一个总是和指针大小一样大小的类型(除了指针类型是:))吗?例如,在 32 位版本上它应该是 32 位,在 64 位版本上应该是 64 位。我在印象中 size_t 就是这样的类型。
  • @UberMongoose:首先,请注意,甚至没有要求指针的大小都相同。他们通常会,但这不是必需的。在大多数典型情况下,size_t 也将是相同的,但同样不能保证(我知道至少有几个例外)。 MS(例如)定义了一些类型,例如 INT_PTR(与指针大小相同的整数),但这远非通用。可能你能做的最好的事情就是在配置头中使用 typedef,这样你就可以在你需要的平台上进行修改。
  • intptr_t? "以下类型指定一个有符号整数类型,其属性是任何指向 void 的有效指针都可以转换为该类型,然后转换回指向 void 的指针,结果将与原始指针进行比较"
  • @rici:啊,就是这样。很棒的建议(也是我以前没有注意到的)。
  • 理论上,intptr_t 是“可选的”,但我还没有遇到它的缺席。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多