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

为什么STD::memcpy(作为类型双关语的替代)不会导致未定义的行为?

湛玄裳
2023-03-14

在寻找将sizeof(double)chars组合为double的方法时,我在几篇文章中看到,使用std::memcpy推荐的方法:

char bytes[sizeof(double)];
// fill array
double d;
std::memcpy(&d, bytes, sizeof(double));

但是,我想知道为什么d的进一步用法可以定义行为。

如果它不是double,而是一个复杂的类对象,那么访问它肯定也不会被定义,对吗?那么,为什么double会是这种情况呢?

Edit:为了使我的问题清楚,我想指定我的目标:我想找到一种方法,将几个字符组合成一个double并进一步使用这个double,而不会导致未定义的行为。我不希望指定double的值。无论如何,我认为这是不可能的,因为标准甚至没有提到double的大小,更不用说位布局了。但是,我要求D具有一些有效的(例如,'accessible')double-value。

共有1个答案

弓智明
2023-03-14

类型双关语是被禁止的,因为它的思想是对C++对象模型的嘲弄。一块内存存储一个对象,如果您开始访问它,就像它存储了其他对象一样,那么这意味着什么呢?如果您可以随意地以int的形式从内存中读取,以float的形式写入,然后以short的形式读取,那么对象的存在意味着什么呢?

在基本可复制的对象之间复制字节只是设置对象值的另一种方式。实际上,这就是一个对象“基本可复制”的逻辑含义:该对象的含义仅由构成其对象表示的字节序列定义(复杂对象不是这样)。而是保存哪些对象的记忆的神圣性。没有“双关语”;只是到处复制数据。

 类似资料:
  • 计算数组长度有一个众所周知的模式: 此模式适用于静态数组和恒定大小的自动数组。它也适用于C99中的可变长度数组。 我想应用类似的想法来计算动态数组的大小(以字节为单位): 这比 更好不是指实际的数组元素类型。因此,它不需要代码的读者知道类型。 然而,我不清楚表达式是否会导致未定义的行为。随着它的扩展: 如果为,则结果表达式有问题: 根据C99标准: (C99,6.3.2.3p3):“具有值 运算符

  • 问题内容: var x int done := false go func() { x = f(…); done = true } while done == false { } 这是Go代码。我的恶魔告诉我,这是UB代码。为什么? 问题答案: Go Memory Model不保证该程序将始终遵守在goroutine中写入x的值。go常规销毁 部分中提供了一个类似的错误程序作为示例。 在本节中,G

  • 问题内容: 我正在大学学习基础知识,并且希望对Eclipse中的以下错误有所帮助:“对于类型ShopCLI,未定义方法getCost()”& 这是我的代码 问题答案: 方法是在订单类中定义的,而不是在类中定义的。所以你的代码: 应该改为

  • 你好,我有一个用Kotlin编写的应用程序,它使用Spring Boot框架和Apache Camel:https://camel.Apache.org/components/latest/smpp-component.html#_spring_boot_auto_configuration 所以我是Smpp协议的新手,我正在尝试连接到SMC模拟器,所以我想我的“客户机”应该在等待来自SMC的消息

  • 在 C 和 C 中,当要复制的字节数为零时, 转换为变量是否为未定义的行为? 这个问题并不是纯粹的理论问题。我有一个场景,其中调用了,如果目标指针指向memory,那么大小参数保证为零。所以我想知道我是否需要把它作为一个特殊情况来处理。