相关疑难解决方法(0)

通过指针访问是否会更改严格的别名语义?

有了这些定义:

struct My_Header { uintptr_t bits; }

struct Foo_Type { struct My_Header header; int x; }
struct Foo_Type *foo = ...;

struct Bar_Type { struct My_Header header; float x; }
struct Bar_Type *bar = ...;
Run Code Online (Sandbox Code Playgroud)

说这个C代码("案例一")是否正确:

foo->header.bits = 1020;
Run Code Online (Sandbox Code Playgroud)

......实际上与此代码("case two")在语义上是不同的:

struct My_Header *alias = &foo->header;
alias->bits = 1020;
Run Code Online (Sandbox Code Playgroud)

我的理解是它们应该是不同的:

  • 情况一考虑分配不能影响Bar_Type中的标题.它只被视为能够影响其他Foo_Type实例中的标头.

  • 情况二,通过强制通过通用别名指针进行访问,将导致优化器实现所有可能包含a的类型的所有投注struct My_Header.它将通过任何指针类型与访问同步. (例如,如果你有一个Foo_Type指向实际上是什么的Bar_Type,它可以通过标题访问并可靠地找出它有哪些 - 假设标题位可以告诉你的东西.)

这依赖于优化器不会变得"聪明"并将案例二重新设置为案例一.

c strict-aliasing language-lawyer

5
推荐指数
1
解决办法
172
查看次数

标签 统计

c ×1

language-lawyer ×1

strict-aliasing ×1