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

时间:2014-06-04 22:32:42

标签: c++ c++11

是否符合C ++ 11标准(或者如果不符合,至少通常可接受的)方式来确定地址是否与缓存行边界对齐?

E.g。像这样的东西:

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

2 个答案:

答案 0 :(得分:3)

有一个std::align功能但显然需求不大:it's missing in gcc 4.9 and badly bugged in MSVC

它的拟议实施(它的简短到足以阅读)是

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 );
}

...这里有点矫枉过正,因为只是测试一个已经对齐的指针,它可以归结为你的方法(使用bitbashing而不是%,但无论如何)。它的实现是,as @IgorTandetnik points out,&#34;对那些知道底层机器的寻址结构的人来说并不奇怪&#34;

答案 1 :(得分:3)

如果你有一个符合C ++ 11的编译器,那么它的文档会告诉你。

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

  

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

该术语并不仅仅意味着“非便携式”,它增加了1.3.10中的具体要求:

  

实施违规行为

     

行为,对于格式良好的程序构造和正确的数据,取决于实现和   每个实施文件

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