Given alignas(N) char buffer[N]; and a char* p between [&buffer[0], &buffer[N-1]], can I obtain a pointer to buffer[0] by using p and N?
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]);
}
I'd like to do it in portable C++ (if possible), so something like casting a pointer to uintptr_t and then performing arithmetic on it may not be used.