【发布时间】:2014-05-18 07:42:00
【问题描述】:
我已经阅读了关于 stackoverflow 的几篇文章,例如 size_t vs. uintptr_t 和 Is sizeof(size_t) == sizeof(void*) always true?,并且了解到根据 C++ 标准,SIZE_T 和 void* 的大小可以不同,以考虑诸如 16 位分段架构之类的架构。
所以我想将我的场景的平台限制为 Windows,无论是 x86、x64、WoA(Arm 上的 Windows):在 Windows 上,如果我 malloc 创建一个 void* 类型的指针,我想要在将指针传递给 memcpy 或其他东西之前做指针算术,我必须这样做:
void* p = malloc(100);
memcpy(reinterpret_cast<void*>((reinterpret_cast<SIZE_T>(p) + offset), p2, 100);
这看起来很乏味,特别是如果您必须在任何地方来回乱扔这种类型的铸造(我正在使用各种偏移量)。鉴于这是在 Windows 平台上,我想知道是否可以进行一些简化来减少这种类型的样板代码?
谢谢。
【问题讨论】:
-
理想情况下,首先创建正确的类型。否则,请使用
char *进行演员表进行算术运算。这将始终有效(只要您注意对齐等,可以将其转换回您需要的任何类型)。 -
在 C++ 中,几乎所有问题都有比
void *和malloc和memcpy更好的选择 -
对于除 0 以外的任何
offset值看起来都非常不安全。您的意思是memcpy(...,100-offset)吗? -
现在是使用内联模板函数的绝佳时机,也可以使用不太理想的宏。