In einem Programm, das ich wurde auf die folgende Art und Weise auf irgend einem verwendeten Alias für Byte arbeiten:Warum ist basic_fstream <vorzeichenloses Zeichen> Größenordnung unter basic_fstream <char> unter Windows?
#include <fstream>
#include <vector>
using Byte = unsigned char;
void write(const Byte* buffer, size_t size) {
std::basic_fstream<Byte> file("1gb_file", std::ios::in | std::ios::out);
file.write(buffer, size);
file.flush(); // To ensure the data is being written, to eliminate caching claims
}
int main(){
auto GB = 1024u * 1024u * 1024u;
std::vector<Byte> zeros(GB, 0);
write(zeros.data(), zeros.size());
return 0;
}
Die Zeit diese Funktion auf Byte == unsigned char
auszuführen hat: 52.0245s auf meine neue SSD, MSVC-x64 auf Release Modus.
Auf der anderen Seite, wenn wir die Definition zu Byte == char
ändern: 1.46725s. Das ist es.
Warum ist dieser Unterschied, und gibt es allgemeine gute Praktiken bei der Verwendung der Standardbibliothek, um solche Fallstricke zu vermeiden?
Hinweis (Bearbeitet wegen eines Fehlers): Unter Linux läuft der Code tatsächlich nicht, wenn er unsigned char (auf gcc und clang) gegeben wird, wie @SergeyA darauf hinwies. Die GCC-Version unter Windows funktioniert auch nicht, im Gegensatz zu dem, was ich vorher geschrieben habe.
Warum mussten Sie die Frage so hart auf Ihre Leser richten? Ihre Motive oder Ihr Alias sind uns egal. Ihre Frage scheint in sich abgeschlossen zu sein. Alles, was wir brauchen, sind zwei Codeschnipsel, Kompilierungsflags und Befehlszeilen mit Zeiten für beide. – SergeyA
In Ordnung. Wird das beheben. – Michael
@SergeyA - die Frage ist genau dort im Titel des OP - das erste, was Sie lesen. – MFisherKDX