首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc问题与std::可选的和包装的结构成员

gcc问题与std::可选的和包装的结构成员
EN

Stack Overflow用户
提问于 2022-06-24 07:46:05
回答 1查看 101关注 0票数 2

我需要使用一个打包的结构来解析传入的数据。我还有一个std::可选的值,我想分配一个struct成员的值。然而,它失败了。我想我理解这个问题,基本上,引用一个与内存宽度不一致的变量可能是一件坏事。

代码示例使用clang 14编译,而不是用gcc 12编译。它是一个bug还是一个“特性”?

代码语言:javascript
复制
#include <cstdint>
#include <optional>

struct Data {
    uint8_t a{};
    uint32_t b{};
} __attribute__((packed));

int main() {
    Data t;
    std::optional<uint32_t> val{};
    val = t.b;  // <<< this failes
    val = (decltype(t.b)) t.b;
}

clang:https://godbolt.org/z/eWfaqb3a3

gcc:https://godbolt.org/z/or1W5MbdG

我知道general problems的结构很紧凑。由于我的目标是一个带有x86-64的嵌入式设备,并且正在分析的数据来自一个工业标准总线,我相信我是安全的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-24 08:04:47

这是一个关于clang和gcc如何假设ARM cpu配置的问题。

ARM cpu有一点表明,是不对齐的访问应该导致处理器陷阱,还是由cpu透明地使用较慢的访问方法来处理。Clang默认为CPU,允许非对齐访问,而gcc默认为捕获未对齐访问的cpu。

因此,对于clang来说,为未对齐的int&创建一个t.b是非常好的,因为CPU将处理可能导致透明的未对齐访问。

另一方面,对于gcc来说,从int&风险代码创建一个t.b,访问它并造成一个陷阱。使用int&的函数合同规定,int必须对齐。因此编译器会失败,因为无法满足约定。

但是,如果编写(decltype(t.b)) t.b;,则需要创建要使用的t.b副本,这将避免未对齐的问题,因为编译器知道如何复制未对齐的uint32_t

可以指定编译器标志以更改关于未对齐访问的默认假设。允许gcc对代码进行编译,但假设您的ARM cpu将被配置为允许所述的非对齐访问。

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

https://stackoverflow.com/questions/72740619

复制
相关文章

相似问题

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