Большинство опытных программистов знают, что выравнивание данных важно для производительности программы. Я видел, как программист написал программу, которая выделяет больший размер буфера, чем им нужно, и используйте ориентированный указатель в начале. Я задаюсь вопросом, должен ли я сделать это в своей программе, я понятия не имею, есть ли гарантия выравнивания адреса, возвращаемого новой операцией С++. Поэтому я написал небольшую программу для тестирования
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. Кажется, что все адреса, возвращаемые новой операцией, выровнены. Но я не уверен. Поэтому мой вопрос: есть ли какие-либо гарантии? Если у них есть гарантия, мне не нужно выравниваться, если нет, я должен.
