gpt4 book ai didi

c++ - 什么特征/概念可以保证 memsetting 一个对象是明确定义的?

转载 作者:IT老高 更新时间:2023-10-28 21:51:02 26 4
gpt4 key购买 nike

假设我定义了一个 zero_initialize() 函数:

template<class T>
T zero_initialize()
{
T result;
std::memset(&result, 0, sizeof(result));
return result;
}

// usage: auto data = zero_initialize<Data>();

为某些类型调用 zero_initialize() 会导致未定义的行为1, 2。我目前正在强制执行 T 来验证 std::is_pod .随着该特性在 C++20 中被弃用以及概念的出现,我很好奇 zero_initialize() 应该如何发展。

  1. 什么(最小)特征/概念可以保证 memsetting 对象的定义明确?
  2. 我应该使用 std::uninitialized_fill而不是 std::memset?为什么?
  3. 这个函数是否被 C++ 初始化语法中的一个类型的子集淘汰了?还是会与即将推出的 future C++ 版本一起使用?

1) Erase all members of a class .
2) What would be reason for “undefined behaviors” upon using memset on library class(std::string)? [closed]

最佳答案

从技术上讲,C++ 中没有指定用户代码可以合法地memset 一个 C++ 对象的对象属性。这包括 POD,所以如果你想成为技术人员,你的代码永远不会正确。甚至 TriviallyCopyable 也是一个关于在 现有 对象之间进行逐字节复制的属性(有时通过中间字节缓冲区);它没有提及发明数据并将其塞入对象的位中。

话虽如此,如果您测试 is_trivially_copyable is_trivially_default_constructible,您可以合理地确定这将起作用。最后一个很重要,因为一些 TriviallyCopyable 类型仍然希望能够控制它们的内容。例如,这样的类型可能有一个始终为 5 的私有(private) int 变量,在其默认构造函数中初始化。只要没有可以访问变量的代码更改它,它就永远是 5。C++ 对象模型保证了这一点。

因此,您不能在 memset 这样的对象的同时仍然从对象模型中获得明确定义的行为。

关于c++ - 什么特征/概念可以保证 memsetting 一个对象是明确定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53339268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com