我正在寻找以下问题的答案:是否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;
}
有没有办法告诉 gcc 那个单指针may_alias
另一个?
顺便说一句,请注意,此类问题的 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;
}
取消注释其中一行以查看编译器输出的差异。