当前位置: 首页 > 知识库问答 >
问题:

使用临时存储区域复制基本可复制的类型:允许吗?

东郭元魁
2023-03-14
#include <cstring>
#include <type_traits>
#include <cassert>

int main() {
    std::aligned_storage_t<sizeof(void*), alignof(void*)> storage, copy;

    int i = 42;
    std::memcpy(&storage, &i, sizeof(int));

    copy = storage;

    int j{};
    std::memcpy(&j, &copy, sizeof(int));

    assert(j == 42);
}

这起作用(对于一些作品的定义)。然而,标准告诉我们:

对于任何可复制类型t的对象(基类子对象除外),无论该对象是否具有t类型的有效值,组成该对象的基础字节都可以复制到char无符号charstd::byte的数组中。
如果将该数组的内容复制回该对象,则该对象随后将保留其原始值。[示例:

#define N sizeof(T)
char buf[N];
T obj;                          // obj initialized to its original value
std::memcpy(buf, &obj, N);      // between these two calls to std​::​memcpy, obj might be modified
std::memcpy(&obj, buf, N);      // at this point, each subobject of obj of scalar type holds its original value

-结束示例]

还有这个:

对于任何简单可复制的类型T,如果指向T的两个指针指向不同的T对象Obj1Obj2,其中Obj1Obj2都不是基类子对象,如果组成Obj1的基础字节被复制到Obj2中[示例:

T* t1p;
T* t2p;
    // provided that t2p points to an initialized object ...
std::memcpy(t1p, t2p, sizeof(T));
    // at this point, every subobject of trivially copyable type in *t1p contains
    // the same value as the corresponding subobject in *t2p

-结束示例]

在任何情况下,它都提到允许在缓冲区中复制一个简单可复制的类型,然后将其复制回原始类型的新实例中。
在上面的html" target="_blank">示例中,我做了类似的事情,另外我还将缓冲区复制到一个新缓冲区中(这更像是现实世界中的情况)。

在问题顶部链接的评论中,作者说这种行为被低估了。另一方面,我看不出如何通过网络发送int,并在另一端使用它(在缓冲区中复制int,通过网络发送,将其作为缓冲区接收,并在int的实例中memcpy--大致与我在示例中所做的一样,在没有网络的情况下),如果不允许这样做,则如何通过网络发送int

这是允许的一些其他项目的标准,我错过了还是这是真的低估了?

共有1个答案

印高阳
2023-03-14

我读起来很好。

您已经将obj1的底层字节复制到obj2中。两者都是琐碎的,属于同一类型。你引用的散文明确地允许这样做。

通过显式允许的重新解释为char*,将所述底层字节临时存储在大小正确、对齐正确的保存区域中,这一事实似乎并没有改变这一点。它们仍然是“那些字节”。没有规则规定复制必须是“直接的”才能满足这样的功能。

 类似资料:
  • FAQs in section [1]: [1.1] 作者 [1.2] 版权布告 [1.3] 复制许可 [1.4] 免责事项 [1.5] 商标 [1.6] C++-FAQ-Lite != C++-FAQ-Book 1.1 作者 Marshall Cline [email protected]   (简体中文版翻译:申旻 [email protected]) 1.2 版权布告 原文: The ent

  • 我有一个简单的JavaFX应用程序,它允许用户查询数据库并查看表中的数据。 我使用的是标准的javafx.Scene.Control.TableView类。是否有一种简单的方法来启用单元格复制?我做了一些搜索,我看到其他人创建自定义菜单命令...我不想创建一个自定义菜单,我只想要基本的键盘复制与单细胞工作。 我使用的是单一选择模式,但如果需要,我可以更改为其他模式:

  • 我们有一个在美国和欧盟托管的应用程序。为了获得更好的性能,我们将在这两个位置上托管一个datastore实例。 现在我们的问题是如何将数据从美国数据库复制到欧盟数据库? 还是不管我们从技术角度将数据存储在哪里?

  • 我需要把允许起源在我的Jersery项目。m得到错误:-访问控制-允许-起源-问题在角-2我应该把需要。

  • 我试图获取具有特定类名的所有元素: 然而我得到的错误是: 我知道类名中不允许有空格,但是我该怎么办呢? 谢啦

  • 今天我遇到了一些我不太理解的复制构造函数。 考虑下一个代码: 然后在将原点分配给复制时调用复制构造函数,这是有意义的。但是,如果我将复制的声明更改为 它不叫。即使当我使用< code>create()函数时,它也不会调用复制构造函数。但是,当将其更改为 它确实调用了复制构造函数。一些研究解释说,允许编译器优化复制构造函数,这听起来是件好事。直到复制构造函数是非默认的,因为那时它可能会,也可能不会做