【发布时间】:2015-05-21 21:05:41
【问题描述】:
我最近看到一段代码,它使用存储缓冲区创建对象,然后简单地交换缓冲区以避免复制开销。这是一个使用整数的简单示例:
std::aligned_storage_t<sizeof(int), alignof(int)> storage1;
std::aligned_storage_t<sizeof(int), alignof(int)> storage2;
new (&storage1) int(1);
new (&storage2) int(2);
std::swap(storage1, storage2);
int i1 = reinterpret_cast<int&>(storage1);
int i2 = reinterpret_cast<int&>(storage2);
//this prints 2 1
std::cout << i1 << " " << i2 << std::endl;
这在一般情况下感觉像是未定义的行为(特别是交换缓冲区,然后访问对象,就好像它们仍然存在一样),但我不确定标准对这种存储和放置 new 的使用有何规定。非常感谢任何反馈!
【问题讨论】:
-
对于CopyConstructible 类型应该没问题。
-
为什么不交换
reinterpret_cast<int&>(storage1)和reinterpret_cast<int&>(storage2)? -
@immibis 因为这是在原始代码中所做的。
标签: c++ c++11 language-lawyer undefined-behavior