是否有一种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指出的那样,它的实现"对于那些知道底层机器的寻址结构的人来说并不奇怪"