繁体   English   中英

-fno-strict-aliasing作为函数属性

[英]-fno-strict-aliasing as function attribute

我出于性能考虑而在其中进行类型调整的功能。 基本上,我有一个32×32位数组存储为32个uint32s数组:

struct Tile {

    uint32_t d[32];

};

然后,我要计算32 x 32瓦片的28 x 28“内部”的人口(“ 1”的数量)。 天真的方法将对机器的popcnt指令进行28次调用,每行一次。 但是,由于popcnt可以采用64位参数,因此可以将其减少为14个popcnt调用:

int countPopulation(Tile* sqt) __attribute__((optimize("-fno-strict-aliasing"))) {

    int pop = 0;

    for (int i = 2; i < 30; i += 2) {
        const uint64_t v = *reinterpret_cast<const uint64_t*>(sqt->d + i);
        pop += __builtin_popcountll(v & 0x3ffffffc3ffffffcull);
    }

    return pop;

}

如果我不包括该属性:

__attribute__((optimize("-fno-strict-aliasing")))

那么,由于明显的原因,g ++会一直抱怨我的类型调整:

warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
         const uint64_t v = *reinterpret_cast<const uint64_t*>(sqt->d + i);

另一方面,如果我确实包含该属性,则某些g ++版本会抱怨,而其他版本则不会。 在尝试过的机器上,我得到:

  • g ++(Ubuntu 4.8.4-2ubuntu1〜14.04.1)4.8.4 抱怨
  • g ++-4.6.real(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3 不抱怨
  • g ++(Debian 5.3.1-5)5.3.1 20160101 不抱怨

g ++ 4.8.4的Ubuntu风格怎么了?

不要键入双关语。 没有任何理由。 而是正确地使用memcpy()int64_t参数进行复制。 优化器将完成其余的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM