有了这些定义:
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,它可以通过标题访问并可靠地找出它有哪些 - 假设标题位可以告诉你的东西.)
这依赖于优化器不会变得"聪明"并将案例二重新设置为案例一.