如何确定地址是否与缓存对齐



是否有一种c++ 11标准兼容(或者如果不兼容,至少一般可以接受)的方法来确定地址是否与缓存线边界对齐?

。像这样:

T* p = SOMETHING;
bool aligned = reinterpret_cast< std::uintptr_t > (p) % CACHE_LINE_SIZE == 0;

如果你有一个c++ 11兼容的编译器,那么它的文档告诉你。

正如Igor在评论中提到的,reinterpret_cast的规则包括:

指针可以显式转换为任何大到足以容纳它的整型。映射函数是实现定义的

这个术语不仅仅意味着"不可移植",它还增加了具体的要求,见1.3.10:

implementation-defied行为

行为,对于一个格式良好的程序结构和正确的数据,这取决于实现和每个实现文档

如果编译器没有记录转换为整数的指针是否实际上是内存地址,那么它就不是c++编译器。

有一个std::align函数,但显然不太需要:它在gcc 4.9中没有,在MSVC中有严重的bug。

它的建议实现(它足够短,只需阅读)是

inline void *align( std::size_t alignment, std::size_t size,
                    void *&ptr, std::size_t &space ) {
    std::uintptr_t pn = reinterpret_cast< std::uintptr_t >( ptr );
    std::uintptr_t aligned = ( pn + alignment - 1 ) & - alignment;
    std::size_t padding = aligned - pn;
    if ( space < size + padding ) return nullptr;
    space -= padding;
    return ptr = reinterpret_cast< void * >( aligned );
}

…这里有点夸张,因为要简单地测试一个已经对齐的指针,它可以精确地归结为您的方法(使用bitbash而不是%,但没关系)。正如@IgorTandetnik指出的那样,它的实现"对于那些知道底层机器的寻址结构的人来说并不奇怪"

最新更新