There have previously been some great answers on memory alignment, but I feel don't completely answer some questions.
E.g.:
What is data alignment? Why and when should I be worried when typecasting pointers in C?
What is aligned memory allocation?
I have an example program:
#include <iostream>
#include <vector>
#include <cstring>
int32_t cast_1(int offset) {
std::vector<char> x = {1,2,3,4,5};
return reinterpret_cast<int32_t*>(x.data()+offset)[0];
}
int32_t cast_2(int offset) {
std::vector<char> x = {1,2,3,4,5};
int32_t y;
std::memcpy(reinterpret_cast<char*>(&y), x.data() + offset, 4);
return y;
}
int main() {
std::cout << cast_1(1) << std::endl;
std::cout << cast_2(1) << std::endl;
return 0;
}
The cast_1
function outputs a ubsan alignment error (as expected) but cast_2
does not. However, cast_2
looks much less readable to me (requires 3 lines). cast_1
looks perfectly clear on the intent, even though it is UB.
Questions:
1) Why is cast_1
UB, when the intent is perfectly clear? I understand that there may be performance issues with alignment.
2) Is cast_2
a correct approach to fixing the UB of cast_1
?