Die meisten erfahrenen Programmierer weiß, Datenabgleich für Programmleistung wichtig ist. Ich habe gesehen, dass ein Programmierer ein Programm geschrieben hat, das eine größere Puffergröße zuweist, als sie benötigen, und den ausgerichteten Zeiger als Anfang verwenden. Ich frage mich, sollte ich das in meinem Programm, ich habe keine Ahnung, gibt es keine Garantie der Ausrichtung der Adresse zurück von C++ 's neue Operation. Also schrieb ich ein kleines ProgrammGibt es eine Garantie der Ausrichtung der Adresse Rückkehr von C++ 's neuer Operation?
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");
Der Compiler zu testen, die ich benutze ist Visual C++ Express 2008. Es scheint, dass alle Adressen der neuen Operation zurückgegeben ausgerichtet sind. Aber ich bin mir nicht sicher. Meine Frage ist also: Gibt es irgendeine Garantie? Wenn sie Garantie haben, muss ich mich nicht ausrichten, wenn nicht, muss ich.
In der Theorie. Wenn Sie gcc + glibc und SSE auf einem 32-Bit-System verwenden, beachten Sie in der Praxis http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15795. – timday
@timay: Dieses Problem mit SSE-Typen galt auch für neuere Versionen von MSVC++ (z. B. .NET 2003). Ich habe nicht die neueste Version getestet, aber ich vermute, dass es immer noch so ist. –
Der Wert, der von der 'operator new []()' -Helferzuweisungsfunktion zurückgegeben wird, die diese Anforderung betrifft, ist nicht derselbe Zeiger, den Sie vom Operator 'new []' erhalten. Diese Antwort ist falsch. –