免責事項: この質問は一般的な概念に関するものです。実際のアプリケーションのコンテキスト全体を提供する必要がなくても、ここで明確に質問できるように、質問を「軽視」しました。「どうしてそんなことをするの?」などのコメントがたくさん寄せられることはすでに予想できます。しかし、質問を額面どおりに受け取っていただければ幸いです。
事前定義された構造体から実行時に C のデータ構造を動的に合成したいとします。
この質問をする方法を知る最良の方法は、コード サンプルを使用することです。
Foo
以下では、との 2 つの構造体を定義していBar
ます。また、構造体を定義してFooBar
、コンパイル時に生成される複合型と実行時に生成される "動的に合成された" 型との少なくとも 1 つの違いを説明します。
#include <stdlib.h>
#include <stdio.h>
typedef struct Foo {
char junk1;
char junk2;
} Foo;
typedef struct Bar {
int junk3;
int junk4;
} Bar;
typedef struct FooBar {
Foo foo;
Bar bar;
} FooBar;
int main()
{
printf("Sizes: %li, %li, %li\n", sizeof(Foo), sizeof(Bar), sizeof(FooBar));
// Prints: Sizes: 2, 8, 12
// Because Foo is aligned on 1-byte boundaries and has total size of 2 bytes.
// Bar is aligned on 4-byte boundaries and has total size of 8 bytes.
// But FooBar is aligned on 4-byte boundaries due to the ints in Foo. Therefore,
// the compiler added 2-bytes of padding after the foo member.
// The following "works", but only allocates 10 bytes, and
// "Bar" members are now "misaligned":
void * syntheticFooBar = malloc(sizeof(Foo) + sizeof(Bar));
((Foo*)syntheticFooBar)->junk1 = 1;
((Foo*)syntheticFooBar)->junk2 = 2;
((Bar*)(syntheticFooBar + sizeof(Foo)))->junk3 = 3;
((Bar*)(syntheticFooBar + sizeof(Foo)))->junk4 = 4;
free(syntheticFooBar);
return 0;
}
だから私の質問は次のようになります:
1.) 適切なデータ配置がないと、パフォーマンスにどの程度影響しますか? 合成構造の「メンバー」へのアクセスに伴うオーバーヘッドを考えると、データアライメントは重要な要因ですか?
2.) ランタイム合成の制約を考慮して、これを行うためのより良い方法はありますか?