是否有一种可移植的(c++标准)方法来计算先前对齐的指针?



给定alignas(N) char buffer[N];和[&buffer[0],&buffer[N-1]]之间的char* p,可以通过pN获得指向buffer[0]的指针吗?

char* previous_aligned_pointer(char* ptr, size_t align) {
// how?
}
int main() {
constexpr int N = 32;
alignas(N) char buffer[N];
assert(previous_aligned_pointer(&buffer[rand() % N], N) == &buffer[0]);
}

我想在可移植的c++中这样做(如果可能的话),所以像将指针转换为uintptr_t然后在其上执行算术这样的事情可能不会被使用。

有一个标准库函数来获取下一个对齐指针。它叫做std::align。然后,您可以减去对齐方式以获得前一个对齐方式。

一般来说,这可能会在缓冲区之外进行指针算术,在这种情况下,减法在技术上是UB。如果这是一个问题,那么你可以避免UB,如果你可以在缓冲区中分配额外的空间,这样下一个对齐的指针总是在缓冲区内。

唯一的另一种方法是自己实现它,这将不得不依赖于转换为整数类型,而整数类型依赖于实现相关的不保证行为。总之:不,我不认为有一个通用的严格符合标准的解决方案。


但是,对于您的示例情况,没有问题。下一个对齐的地址是指针经过结束,所以可以减去N来得到缓冲区开始的地址。

相关内容

  • 没有找到相关文章

最新更新