动态类型转换为变量类型

互联网 行业动态 更新时间:2024-06-13 00:21:05

Yak*_*ont 5

memcpy每个现代 C++ 编译器都完全理解memcpy.

或者,您知道,关闭优化。

memcpy((void*)&a.f1, (void*)&memory[someAddress], sizeof(A::f1));

这里既没有理由void*强制转换为,也没有理由使用危险的 C 风格转换。

std::memcpy(&a.f1, &memory[someAddress], sizeof(a.f1));

这是一种符合标准的方法来移动表示与a.f1over相同类型数据的内存a.f1,假设a.f1可以简单地复制。(注意我使用了相同的标记序列 -- a.f1-- 用于写入的内容和大小。)

编译器会将其优化为适当的程序集,并且不会有函数调用开销。

Live example,可以看到生成的程序集。

现在,您可能会反对“但不能保证!”。

C++ 标准不包括a+b不会作为循环实现的保证int r = 0; for (int i = 0; i < a; ++i){++r;} for (int i = 0; i < b; ++i){++r;}

你不能假设你的 C++ 编译器是敌对的。

现有的 C++ 编译器优化了对memcpy. 编写代码假设它不会发生是浪费时间。

你也可以写一个稍微安全一点的memcpy

template<class Dest>
void memcpyT( Dest* dest, void const* src ) {
  static_assert( std::is_trivially_copyable_v<Dest> );
  memcpy( dest, src, sizeof(Dest) );
}

我在上面的示例中包含了它作为替代。

@BbIKTOP 如果您认为 `memcpy(&amp;a, &amp;b, 7)` 明确告诉 C++ 使用链接,那您就错了。一种常见的误解是,您脑中在 C++ 程序代码到汇编之间的幼稚映射就是 C++ 的定义。它不是。C++ 标准库定义了编译单元,C++/C 标准库的主体不是编译单元,您的工具链如何工作的事实是标准之外的实现细节。C/C++ 标准描述了调用 `memcpy` 的作用,它没有解决它被链接或其他任何问题。 (3认同)

更多推荐

类型,转换为,变量,动态

本文发布于:2023-04-23 10:34:57,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/hyzx/085fa560b852075744fb276adb634764.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:类型   转换为   变量   动态

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!