Большинство опытных программистов знают, что выравнивание данных важно для производительности программы. Я видел, как программист написал программу, которая выделяет больший размер буфера, чем им нужно, и используйте ориентированный указатель в начале. Я задаюсь вопросом, должен ли я сделать это в своей программе, я понятия не имею, есть ли гарантия выравнивания адреса, возвращаемого новой операцией С++. Поэтому я написал небольшую программу для тестирования
for(size_t i = 0; i < 100; ++i) {
char *p = new char[123];
if(reinterpret_cast<size_t>(p) % 4) {
cout << "*";
system("pause");
}
cout << reinterpret_cast<void *>(p) << endl;
}
for(size_t i = 0; i < 100; ++i) {
short *p = new short[123];
if(reinterpret_cast<size_t>(p) % 4) {
cout << "*";
system("pause");
}
cout << reinterpret_cast<void *>(p) << endl;
}
for(size_t i = 0; i < 100; ++i) {
float *p = new float[123];
if(reinterpret_cast<size_t>(p) % 4) {
cout << "*";
system("pause");
}
cout << reinterpret_cast<void *>(p) << endl;
}
system("pause");
Компилятор, который я использую, - это Visual С++ Express 2008. Кажется, что все адреса, возвращаемые новой операцией, выровнены. Но я не уверен. Поэтому мой вопрос: есть ли какие-либо гарантии? Если у них есть гарантия, мне не нужно выравниваться, если нет, я должен.