我遇到了由于违反严格的指针别名规则而引起的问题。我有一个类型T
来自模板和一些整数类型Int
相同大小(如sizeof
)。我的代码基本上执行以下操作:
T x = some_other_t;
if (*reinterpret_cast <Int*> (&x) == 0)
...
Because T
是一些可以有构造函数的任意(大小限制除外)类型,我无法进行联合T
and Int
。 (这仅在 C++0x 中允许,甚至 GCC 还不支持)。
有什么方法可以重写上面的伪代码以保留功能并避免违反严格的别名规则?请注意,这是一个模板,我无法控制T
或值some_other_t
;赋值和随后的比较确实发生在模板化代码内。
(根据记录,上面的代码在 GCC 4.5 上开始崩溃,如果T
包含任何位字段。)
static inline int is_T_0(const T *ob)
{
int p;
memcpy(&p, ob, sizeof(int));
return p == 0;
}
void myfunc(void)
{
T x = some_other_t;
if (is_T_0(&x))
...
在我的系统上,GCC 优化掉了这两个is_T_0()
and memcpy()
,导致只有一些汇编指令myfunc()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)