Sochin ты меня замучал своими придирками. Нормальная задача, нормальные требования и нормальный ответ. Все твои слова - вода.
Придирки? Вода? Цитаты пожалуйста.
Куда уж конкретнее -
#pragma pack не описана в стандарте языка, т.е. она не является стандартной для С++. Ее употребление - это нестандартная фича. Если мы говорим о конретном компиляторе - нет вопросов. Но ты настаиваешь на том, чтобы не указывать конкретную реализацию. А если мы говорим о языке в целом, то твой ответ на твою же задачу не является верным для общего случая. Вода?
Я, в отличие от тебя, привел конкретную реализацию, конкретный ответ и конкретные компиляторы где все это работает.
Да нет проблем, работает и хорошо, я ж не говорю что не работает. Но я, похоже что в отличие от тебя, понимаю что такое язык и стандарт и что такое компилятор и нестандартные фичи.
Если ты уверен что я ошибаюсь, тогда приведи конкретный пример, как Storm.
Компилятор назвать? Пожалуйста, в качестве примера
IBM Rational Apex® C/C++ compilerВот посмотри, что пишут ребята из IBM (понимаю, что для тебя это возможно полная туфта, также как и стандарт языка, но все же):
C/C++ programmers often rely upon '#pragma pack' to remove padding between structure fields. However, this pragma has many pitfalls and it is not supported in the IBM Rational Apex® C/C++ compiler.
There are some reasons not to use pragma pack:
[1] It is implementation defined (as with all pragmas). Some processors have the instruction set to support non-aligned memory whereas others do not.
[2] The syntax of pragma pack varies across implementations. 'pragma pack (n)' is the most common syntax for setting a particular packing alignment, but implementations vary in how to tell the compiler reset to the default alignment. Sometimes it's 'pragma pack (0)' while other times it's 'pragma pack ()'. Plus there are the 'push' and 'pop' derivatives offered by some vendors. In summary, the pragma is not portable.
[3] pragma pack is stand-alone and affects all following declarations until the next pragma pack or the end of the compilation unit. Therefore, it is very easy to apply packing to structures where it is not wanted.
[4] pragma pack specifies a *maximum* alignment. Thus, 'pragma pack (2)' followed by a structure of chars could give you either (i) each char packed into a byte or (ii) each char packed into a word. You won't know without debugging the code.
Нестандартных фокусов тут нет. Если ты не сталкивался с такой проблемой на практике, это не значит что я тут шаманю.
Ой я тебя умоляю. Твой ответ не соответствует стандарту С++. Если ты не уважаешь стандарты, это другой вопрос. Менее нестандартным (с точки зрения стандарта С++ конечно, а то может у тебя другое понимание «стандартности/нестандартности») он от этого не становится. И я тут ни при чем. Все вопросы - в комитет по стандартизации.