【发布时间】:2020-02-18 02:14:55
【问题描述】:
如果我知道 T 和 U 类型也有相同的对齐方式,我可以像这样使用一个 malloc 调用吗:
void* allocate_memory(int n, int m) {
return malloc(sizeof(T) * n + sizeof(U) * m);
}
为这两种类型的数组分配连续的内存?
如果没问题,获取指向第二个数组第一个元素的指针的正确方法是什么?转换 void* -> char* -> (+= sizeof(T) * n) -> U* 看起来不错,但我觉得那里可能存在某种未定义的行为。
(我几乎可以肯定它不能在 C++ 中完成,指针算术规则不允许这样做(在任何时候 U 的数组都不会开始存在,所以你不能在这个存储上执行指针算术) . 因此我对 C 规则持谨慎态度)
编辑:
自从P0593R6 被接受并作为缺陷报告应用到所有 C++ 标准回 C++98,对 malloc 的调用隐式地在分配的存储中创建对象。正因为如此,这种构造现在在 C++ 中也有效,并且该范围上的指针算术也得到了很好的定义。
【问题讨论】: