Панель компиляторов структурируется до байтов, кратных 2 или 4, чтобы облегчить доступ к ним в машинном коде.Я не стал бы использовать #pragma pack, если бы это не было действительно необходимо, и это обычно применяется, только когда вы работаете на очень низком уровне (например, уровне прошивки). Статья в Википедии об этом.
Это происходит потому, что у микропроцессоров есть определенные операции для доступа к памяти по адресам, кратным четырем или двум, и это облегчает создание исходного кода, он использует памятьболее эффективно, а иногда код немного быстрее.Конечно, есть способы остановить это поведение, например, директива pragma pack, но они зависят от компиляции.Но переопределять значения по умолчанию для компилятора - плохая идея, у парней с компиляторами была очень веская причина заставить его так себя вести.
Для меня лучшим решением было бы решить это с помощью чистого C, которыйэто очень, очень просто, и будет следовать хорошей практике программирования, а именно: никогда не полагаться на то, что компилятор делает с вашими данными на низком уровне.
Я знаю, что простое выполнение #pragma pack (1) сексуально, просто и дает нам всем ощущение, что мы имеем дело и понимаем непосредственно, что происходит в кишечнике компьютера, и это превращает каждого настоящего программиста, но лучшим решением всегда является то, которое реализовано на языке, который вы используете.Это легче понять и, следовательно, легче поддерживать;это поведение по умолчанию, поэтому оно должно работать везде, и, в данном конкретном случае, решение C действительно простое и понятное: просто прочитайте свой атрибут struct по атрибуту, например так:
void readStruct(header &h, std::ifstream file)
{
file.read((char*) &h.type, sizeof(char));
file.read((char *) &h.size, sizeof(short));
}
(это будет работатьконечно, если вы определяете структуру глобально)
Еще лучше, так как вы работаете с C ++, было бы определить метод-член, который сделает это чтение для вас, а позже просто вызовите myObject.readData(file)
.Вы видите красоту и простоту?
Легче читать, поддерживать, компилировать, приводит к более быстрому и оптимизированному коду, по умолчанию.
Я обычно не люблю связываться сдирективы #pragma, если я не совсем уверен в том, что я делаю.Последствия могут быть удивительными.