За какво е `#pragma pack` в мрежовото програмиране?

 #pragma pack(push)
 #pragma pack(1)

Изтеглих урок и има тези редове в заглавния файл. Ще съм благодарен, ако можете да ми предоставите уроци или препратки, свързани с това.


person codereviewanskquestions    schedule 15.06.2011    source източник


Отговори (3)


Обяснението на Microsoft:

http://msdn.microsoft.com/en-us/library/aa273913(v=vs.60).aspx

Обяснение на AIX xlC на IBM:

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Fcompiler%2Fref%2Frnpgpack.htm

По принцип той определя границите на байтовете, които ще се използват при съхраняване на структура или обединение. Push/pop действа като начин за съхраняване и извличане на тези настройки в стек.

За бъдещи справки може да си спестите време, като потърсите в мрежата ключовите думи, за които питате. Всичко, което направих, за да намеря тази информация, беше да потърся „pragma pack“ на http://www.google.com

person devyndraen    schedule 15.06.2011
comment
Благодаря за вашият отговор. Имам ли нужда от опаковане, ако стартирам сървъра на Linux машина? - person codereviewanskquestions; 15.06.2011
comment
@LCYSoft: вижте отговора на Gilad Naors. Това е специфично за Microsoft. - person Default; 15.06.2011

Всички #pragma отчети са специфични за доставчика.

Това е специфично за Microsoft и описва колко "пакет" (в байтове) компилаторът може да добави към structs за по-добро подравняване.

#pragma pack(push) просто запазва предишната настройка в стека. След това можете да промените условията за опаковане за определен блок от код и по-късно #pragma pack(pop) да възстановите предишните настройки.

person Gilad Naor    schedule 15.06.2011

Това е спецификаторът за пакетиране, специфичен за MSVC++. Можете да разберете какво точно прави от документацията.

Опаковката променя колко подпълване е позволено на компилатора да вмъкне между членовете на данните на дадена структура (или клас), за да поддържа подравняване. В случай на мрежов код, спецификаторът #pragma pack вероятно се използва, така че структурата да може да бъде прехвърлена към char* или void*, за да бъде предадена на някакъв мрежов API, за да изпрати цялата структура по мрежата наведнъж.

(Имайте предвид, че това не е безопасно, тъй като различните машини имат различни правила за подравняване и ред на байтове; това ще работи само ако и двете машини от всеки край на кабела използват един и същ тип хардуер)

person Billy ONeal    schedule 15.06.2011