给定alignas(N) char buffer[N];
和[&buffer[0]
,&buffer[N-1]
]之间的char* p
,可以通过p
和N
获得指向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来得到缓冲区开始的地址。