0

我注意到每次访问打包结构的成员时都会引发此错误

  1. 如何专门为处理错位的功能禁用它?(safe_unaligned_val_16/32/64 - 通过像 memcpy 一样手动逐个字节地构造输出)
  2. 如果我将结构指针传递给函数,GCC 是否会进行一些优化?我注意到一些优化,比如当你有一个具有 4 个字节的原始类型的结构时,它只是将该值传递给一个 32 位寄存器,而函数不改变原始类型的值。如果你知道类似的东西,请详细说明这个^

谢谢,格雷格

4

1 回答 1

0
  1. 如何专门为处理错位的功能禁用它?(safe_unaligned_val_16/32/64 - 通过像 memcpy 一样手动逐个字节地构造输出)

C 语言既没有指定诊断方法,也没有指定任何解决方法。它甚至没有结构包装的感觉,将结构布局的大部分细节留给实现的自由裁量权。

由于您似乎特别对 GCC 感兴趣,因此您可能会发现用于影响诊断的实现的 pragma 可用于此目的。特别是,您可能会发现这样做很方便

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wwhatever-the-relevant-option-is"

// function or functions ...

#pragma GCC diagnostic pop
  1. 如果我将结构指针传递给函数,GCC 是否会进行一些优化?我注意到一些优化,比如当你有一个具有 4 个字节的原始类型的结构时,它只是将该值传递给一个 32 位寄存器,而函数不改变原始类型的值。如果你知道类似的东西,请详细说明这个^

我不知道具体的优化,但实现有很大的优化自由。由编译器负责确保生成的程序的语义等同于 C 对呈现给它的源代码所描述的那些。这样的优化对于满足一组相当严格的要求的函数来说确实是有效和有用的,但是不修改指向的值不足以使这样的优化安全。

于 2019-11-12T13:12:09.310 回答