私は次の質問への答えを探しています:may_alias
あるクラスのオブジェクトへのポインタの属性として適していますFoo
か? それとも、クラス レベルでのみ使用する必要がありますか?
次のコードを検討してください (より複雑な実際の例に基づいています)。
#include <iostream>
using namespace std;
#define alias_hack __attribute__((__may_alias__))
template <typename T>
class Foo
{
private:
/*alias_hack*/ char Data[sizeof (T)];
public:
/*alias_hack*/ T& GetT()
{
return *((/*alias_hack*/ T*)Data);
}
};
struct Bar
{
int Baz;
Bar(int baz)
: Baz(baz)
{}
} /*alias_hack*/; // <- uncommeting this line apparently solves the problem, but does so on class-level(rather than pointer-level)
// uncommenting previous alias_hack's doesn't help
int main()
{
Foo<Bar> foo;
foo.GetT().Baz = 42;
cout << foo.GetT().Baz << endl;
}
その単一のポインターをmay_alias
別のポインターにgccに伝える方法はありますか?
ところで、このような問題の gcc 検出メカニズムは不完全であるため、実際に問題を解決せずにこの警告を簡単に消すことができます。
次のコード スニペットを検討してください。
#include <iostream>
using namespace std;
int main()
{
long i = 42;
long* iptr = &i;
//(*(short*)&i) = 3; // with warning
//(*(short*)iptr) = 3; // without warning
cout << i << endl;
}
行の 1 つをコメント解除して、コンパイラ出力の違いを確認します。