2

私が次のような構造を持っている場合

struct MixedStructure{
char a;
short b;
int c;
char d;
};

パディングが有効になります。

私が知りたいのは、そのような構造をネットワーク経由で送信する際に問題があるかどうかです。

つまり、この構造には、パディングのために実際には8バイトではなく12バイトがあります。もう一方の端に別のパディングスキームが使用されている(または使用されていない)場合、どのような影響がありますか?

4

2 に答える 2

2

GCCを使用している場合は、__packed__属性を使用します。

#define PACKED __attribute__((__packed__))
struct PACKED MixedStructure { ... };

Windowsを使用している場合は、次を使用しますpragma

#pragma pack(push, 1)
struct MixedStructure { ... };
#pragma pack(pop)

位置合わせする場合は、明示的なパディングを使用することもできます。

#include <stdint.h>
#define PACKED __attribute__((__packed__))
struct PACKED MixedStructure {
    int8_t a;
    int8_t pad0; /* added for alignment */
    int16_t b;
    int32_t c;
    int8_t d;
    int8_t pad1[3]; /* added for alignment */
};

上記のように明示的な幅のタイプを使用することもお勧めします。

于 2012-09-06T15:25:07.223 に答える
2

それがあなたの唯一の問題ではありません。sizeof(int)またはsizeof(short)が、その構造体を構築する2つのボックス間で一貫していることをどのように知っていますか?

ほとんどのコンパイラには、固定サイズの変数(uint32_tなど)を指定する方法があります。特定の質問に答えるために、ほとんどのコンパイラにはパッキングを指定する方法もあります。

構造体をバイトのバッファにオーバーレイすることは、高性能ネットワークプログラミングでは非常に一般的なイディオムですが、危険にさらされる可能性があります。また、このイディオムが厳密なエイリアシングにどのように違反しているか、およびエンディアンとは何かについても学ぶ必要があります。

非常に高性能な状況では、これが最良のオプションであることを私は知っています。非常に注意して、相互に通信する可能性のあるすべての潜在的なホスト間で十分にテストしてください。この種のパフォーマンスが必要ない場合は、パッキング/エンディアンなどについて知らないようにする非常にパフォーマンスの高い方法でデータを送信するためのgoogleのプロトコルバッファのようなものをチェックしてください。

于 2012-09-06T15:29:39.797 に答える