gpt4 book ai didi

c++ - reinterpret_cast 的这种使用会调用未定义的行为吗?

转载 作者:行者123 更新时间:2023-11-30 00:35:32 28 4
gpt4 key购买 nike

基本思想是创建一个可变大小的数组,在构造时固定,并在单个分配单元中创建另一个类,以减少开销并提高效率。分配缓冲区以适应数组,并使用另一个对象和新放置来构造它们。为了访问数组的元素和另一个对象,使用了指针算法和 reinterpret_cast。这似乎有效(至少在 gcc 中),但我对标准(5.2.10 Reinterpret Cast)的阅读告诉我这是一个未定义的行为。那是对的吗?如果是这样,有没有办法在没有 UB 的情况下实现这个设计?

完整的可编译示例在这里:http://ideone.com/C9CCa8

// a buffer contains array of A followed by B, laid out like this
// | A[N - 1] ... A[0] | B |

class A
{
size_t index;
//...
// using reinterpret_cast to get to B object
const B* getB() const
{
return reinterpret_cast<const B*>(this + index + 1);
}
};

class B
{
size_t a_count;
//...
virtual ~B() {}
// using reinterpret_cast to get to the array member
const A* getA(size_t i) const
{
return reinterpret_cast<const A*>(this) - i - 1;
}
};

// using placement new to construct all objects in raw memory
B* make_record(size_t a_count)
{
char* buf = new char[a_count*sizeof(A) + sizeof(B)];
for(auto i = 0; i < a_count; ++i)
{
new(buf) A(a_count - i - 1);
buf += sizeof(A);
}
return new(buf) B(a_count);
}

最佳答案

当使用 placement new 时,您需要确保目标内存针对您的数据类型正确对齐,否则就是未定义的行为。在 A 的数组之后,不能保证 buf 的对齐对于 B 类型的对象是正确的。您对 reinterpret_cast 的使用也是未定义的行为。

未定义的行为并不意味着它不会起作用。它可能适用于特定的编译器、一组特定的类类型和指针偏移量等。但是您不能将此代码放在任意符合标准的编译器中并保证它会工作。

使用这些 hack 强烈表明您没有正确设计您的解决方案。

关于c++ - reinterpret_cast 的这种使用会调用未定义的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18770275/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com