问题标签 [trivially-copyable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
136 浏览

c++ - 适用于 `memcpy()` 的相同可简单复制的限制是否也适用于 `std::copy()`?

Cppreference 状态,关于std::memcpy()(强调):

如果对象可能重叠或不是 TriviallyCopyable,则 的行为memcpy 未指定并且可能未定义。

所以,我总是在使用之前检查以确保对象是可简单复制的memcpy(),如下所示:

std::copy()但是,似乎没有这个限制:https ://en.cppreference.com/w/cpp/algorithm/copy 。

这种类型必须是可简单复制才能没有未定义行为的限制是否不适用于std::copy()

另外,我刚刚在我的“安置新”答案中意识到,这让我想知道这整件事,我只是使用memcpy()而不是std::memcpy(),而我不是 using namespace std;,所以调用了哪个函数?是memcpy()不同的实现std::memcpy()吗?

0 投票
1 回答
115 浏览

c++ - 为什么微不足道的复制/移动可构造性取决于微不足道的可破坏性?

除了非平凡的析构函数之外,所有特殊功能都默认的类不是平凡的移动或复制构造。有关示例,请参见https://godbolt.org/z/o83rPz :

GCC 和 Clang 都失败了相应的断言,而 ICC 通过了。奇怪的是,分配不受影响,尽管我可以理解分配对象需要被销毁。但反过来似乎是对的。为什么?为什么ICC不同意?

0 投票
1 回答
70 浏览

c++ - 如何以原子方式复制不可复制的类型

我正在写一个 Atom 类,因为类型 T 不是可简单复制的。我想知道我下面的 load() 和 store() 实现是否会导致竞争条件。

如果可能出现竞争条件,有没有办法在对象被锁定时复制对象而不调用其复制构造函数?

0 投票
2 回答
149 浏览

c++ - 为什么(如果是这样的话)标准说用 memcpy 复制未初始化的内存是 UB?

当一个类成员在构造的那一刻不能有合理的意义时,我不会初始化它。显然,这只适用于 POD 类型,您不能使用构造函数初始化对象。

这样做的好处是,除了节省 CPU 周期,将某些东西初始化为一个没有意义的值之外,我可以使用 valgrind 检测这些变量的错误使用;当我只是给这些变量一些随机值时,这是不可能的。

例如,

在数学问题解决(完成)之前,没有答案。answer提前初始化(到零)是没有意义的,因为这可能不是答案。只有在设置为 trueanswer之后才有意义。finished

因此,在初始化之前使用answer是一个错误,并且完全可以成为 UB。

但是,初始化之前的一个简单副本answer当前也是 UB(如果我正确理解标准),这没有意义:默认的复制和移动构造函数应该能够简单地制作一个简单的副本(又名,如-如果使用memcpy),是否已初始化:我可能想将此对象移动到容器中:

然后使用容器内的副本。

移动具有未初始化的、可简单复制的成员的对象是否确实被标准定义为 UB?如果是这样,为什么?这似乎没有意义。

0 投票
3 回答
111 浏览

c++ - 这是未定义的,因为我 memcpy'ed 一个 non_trivially_copyable 类型?

我很难理解为什么不允许使用 memcpy'ing non_copyable 类型,或者即使我的以下代码是不允许的:

如果我们 malloc 内存并通过指向 int 的指针访问该内存,如下所示:

以同样的方式:

但:

我不明白为什么或者如果在前面的例子中我 memcpy 进入缓冲区是非法的。

0 投票
0 回答
32 浏览

c++ - 不是标准布局的普通类,反之亦然

什么是 C++ 类的示例,它是一个简单的类但不是标准布局类?

反之亦然?(不是 Trivial 类的标准布局类)。