首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制指向易失性数据的指针

复制指向易失性数据的指针
EN

Stack Overflow用户
提问于 2019-04-23 10:25:07
回答 1查看 241关注 0票数 2

假设我有一个指向易失性data.and的输入和输出指针,我尝试对它们使用std::copy

代码语言:javascript
复制
uint32_t volatile* input = /*    */;
uint32_t volatile* output =  /*    */;
std::copy(input,input+512,output);

这应该编译吗?我的想法是它应该这样做,但它在gcc身上失败了,因为它试图使用__builtin_memmove,这需要指向非易失性data.link的指针才能指向godbolt:https://godbolt.org/z/6yDzqb

所以我想我的问题是:这是标准库中的一个bug,还是允许它无法编译?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-23 10:43:31

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

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

除此之外,您可能想要考虑包括<cstdint>而不是<stdint.h>,因为C标准库头只在C++中作为一个不推荐使用的兼容性特性[depr.c.headers]提供。这样做时,请注意这样一个事实,即在这些标准标头中声明的实体(如std::uint32_t )是否在全局名称空间中实际可用是未指定的( [requirements.headers]/4 )。因此,您可能需要考虑使用std::uint32_t而不只是uint32_t等,因为只有前者才能实际保证存在…

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55803461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档