gpt4 book ai didi

c++ - std::copy 在指向 volatile 数据的指针上

转载 作者:行者123 更新时间:2023-11-30 04:48:24 26 4
gpt4 key购买 nike

假设我有一个指向 volatile 数据的输入和输出指针......我尝试对它们使用 std::copy:

uint32_t volatile* input = /*    */;
uint32_t volatile* output = /* */;
std::copy(input,input+512,output);

这应该编译吗?我的想法是它应该,但它在 gcc 上失败了,因为它试图使用 __builtin_memmove,它需要指向非 volatile 数据的指针......链接到 godbolt:https://godbolt.org/z/6yDzqb

所以我想我的问题是:这是标准库中的错误还是允许编译失败?

最佳答案

是的,这应该编译。 std::copy指定 [alg.copy]/2表现 as if通过将迭代器取消引用到源范围中的每个元素而获得的值被简单地分配给通过将迭代器取消引用到目标范围中的相应元素而获得的值。 volatile std::uint32_t可以分配给一个volatile std::uint32_t因为 volatile std::uint32_t不是 const [basic.lval]/7 .

另外,请注意这个 does apparently compile在 GCC 的主干版本上(至少在 godbolt 上可用)。所以我想说这几乎可以肯定是一个错误,现在似乎已经修复了……

除此之外,您可能需要考虑包括 <cstdint>而不是 <stdint.h>因为 C 标准库 header 仅在 C++ 中作为已弃用的兼容性功能提供 [depr.c.headers] .当你这样做时,请注意它是未指定的 [requirements.headers]/4这些标准 header 中是否声明了实体,例如 std::uint32_t , 实际上在全局命名空间中可用。因此,您可能需要考虑使用 std::uint32_t而不仅仅是 uint32_t等等,因为实际上只有前者可以保证存在……

关于c++ - std::copy 在指向 volatile 数据的指针上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55803461/

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