- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于 feature request的 a project of mine ,我想/有人建议我使用 std::launder
在 vector 中移动元素,其中元素只能移动可构造(未定义移动赋值运算符)。
目标是将最后一个元素移动到给定位置 i
,然后弹出前一个元素。
换句话说,生成的代码将是这样的(为此目的的简化版本):
void foo(std::vector<my_type> &vec, std::size_t i) {
my_type *el = vec.data() + i;
el->~my_type();
new (std::launder(el)) my_type{std::move(vec.back())};
vec.pop_back();
}
my_type
定义为:
struct my_type { const int v; };
使用 std::launder
的目的是为可能的优化设置一个障碍,因为 my_type
中的 v
是常量
。因此,为了能够回收为 vec[i]
保留的内存,以便用不同的实例替换包含的对象(实际上,我理论上移动最后一项到不同的位置)。
这是一个有效的方法/解决方案还是仍然是 UB,因为如果我做了类似的事情而不重复 std::launder
就会发生这种情况?
据我所知,std::launder
的目的是允许用户做这样的事情,因此在我看来上面的代码片段是合法的。但如果我错了我也不会感到惊讶,所以我想得到比我更有经验的人的反馈
--- 编辑
同样,我也想交换到相同类型的元素。
生成的代码应该是这样的:
const auto tmp = std::move(vec[i]);
vec[i].~object_type();
new (std::launder(&vec[i])) object_type{std::move(vec[j])};
vec[j].~object_type();
new (std::launder(&vec[j])) object_type{std::move(tmp)};
我非常有信心,如果 std::launder
适合第一个示例,那么出于类似的原因,这个示例也应该适用。我错了吗?
最佳答案
launder
为您提供指向已存在对象的指针。
那里没有对象。您刚刚在上一行中销毁了它。
甚至调用 launder
本身也是纯粹的 UB。
对于这种事情,当您访问 新创建的对象时,需要launder
。不是在您创建它时。
关于c++ - std::launder、std::vector 和 move 仅可构造类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53989927/
我正在阅读 cppreference 并在 std::aligned_storage 的示例中有一个 vector/数组类的例子: template class static_vector {
我正在为 Game Boy Advance 使用 C++ 做一个有点不平凡的项目,而且,作为一个完全没有内存管理的有限平台,我试图避免调用 malloc和动态分配。为此,我实现了相当多的“就地多态容器
我想确认我是否正确使用 std::launder(...)确保我正确理解它的用法。 我正在创建一个 Result在基于 Rust 实现的 C++ 中。 template class ResultSt
考虑这段代码: void f(char * ptr) { auto int_ptr = reinterpret_cast(ptr); // (&i)); } void example_2()
考虑以下固定大小 vector 的简化且不完整的实现: template class Vec { T *start, *end; public: T& operator[](ssize_t i
P0137引入了函数模板 std::launder 并在有关 union 、生命周期和指针的部分中对标准进行了许多更改。 本文要解决的问题是什么?我必须注意的语言变化是什么?我们在洗钱做什么? 最佳答
std::launder 函数要求通过结果可访问的每个字节都可通过参数访问。 “可达”定义如下: A byte of storage is reachable through a pointer va
这是我不明白的示例部分: struct Y { int z; }; int main() { alignas(Y) std::byte s[sizeof(Y)]; Y *q =
当前标准草案(大概是 C++17)在 [basic.compound/4] 中说: [ Note: An array object and its first element are not poin
这个问题跟在这个 one 之后 让我们考虑这个示例代码: struct sso { union{ struct { char* ptr; char size_r
当前的标准草案(大概是 C++17)在 [basic.compound/4] 中说: [ Note: An array object and its first element are not poi
在 const_cast 之后修改一个 const 构造的对象是 UB(我相信是由于不断传播)。即使与 std::launder 结合使用,它仍然是 UB 吗? (哪个 AFAIK 阻止了一些优化,例
[1] 有没有添加p0593r6的情况转化为 C++20(第 6.7.2.11 节对象模型 [intro.object])制作 std::launder没有必要,在 C++17 中需要相同的用例 st
我想知道为什么 std::launder 是一个 constexpr 函数。有没有可以在编译时使用的用例? 最佳答案 因为绝对没有理由不这样做。它实际上只是对编译器具有一些特殊附加含义的恒等函数。它不
我必须使用不同版本的 clang 编译相同的代码。由于代码包含一些 c++17 功能,并非每个版本的 clang 都支持这些功能,因此我想在编译时检查它们是否受支持。据我所知,clang 的 feat
它类似于 std::optional,但不存储额外的 bool。用户必须确保只有在初始化后才能访问。 template union FakeOptional { //Could be a normal
对于 feature request的 a project of mine ,我想/有人建议我使用 std::launder 在 vector 中移动元素,其中元素只能移动可构造(未定义移动赋值运算符
考虑这个 union : union A{ int a; struct{ int b; } c; }; c和 a不是 layout-compatibles类型,因此无法读取
此问题是对 Is adding to a "char *" pointer UB, when it doesn't actually point to a char array? 的后续问题。 在 C
这个问题在这里已经有了答案: Does this really break strict-aliasing rules? (3 个答案) 关闭 5 年前。 以下例子来自std::aligned_st
我是一名优秀的程序员,十分优秀!