私は「LearnCtheHard Way」を読んでいて、誰かが詳細に説明してくれることを望んでいた興味深い問題に遭遇しました。基本的な演習は、Person構造体の例を含む構造体を使用することでした。最初のケースでは、コンストラクター風のメソッド(誰かが:D側で説明してもかまわないのであれば、チュートリアルがこのようにした理由は正確にはわかりません)と次のような構造体がありました。
struct Person {
char *name;
int age;
int height;
int weight;
};
struct Person *Person_create(char *name, int age, int height, int weight)
{
struct Person *who = malloc(sizeof(struct Person));
assert(who != NULL);
who->name = strdup(name);
who->age = age;
who->height = height;
who->weight = weight;
}
残りのコードとともに、これは問題なく実行されますが、次のようなこれらの構造体へのポインタのメモリ位置を出力すると、次のようになります。
int main(int argc, char* argv[]) {
struct Person *joe = Person_create("joe alex", 12, 80, 100);
struct Person *joe = Person_create("frank blank", 20, 72, 140);
}
それらのメモリ値の差は常に正確に40です。これと比較して、次のような構造体コンストラクタの実装は次のようになります。
struct Person{//is the same as above};
struct Person Person_create (char* name, int age, int height, int weight) {
struct Person newPerson;
newPerson.name = name; //and so on
return newPerson
}
上記と同じ値で初期化されたjoeとfrankのメモリ位置を上記の実装で出力すると、それらのメモリ位置の差は常に20であるように見えます。
アセンブリを少し勉強しましたが、コンパイラが構造体のデータ型に従ってメモリのブロックを割り当てることを知っているので、考えていました。どちらの実装でも、char配列には非常に多くの文字があるため、n文字*1=文字スペース、そして私は3つのintを持っているので、3 * 4 = 12; 12 + 9(Joe Alex \ 0 right?)= 21..おそらく\0を間違えたので、20かそこらに等しいのですが、構造体の特定のメモリサイズに関係なく、なぜ2つなのかということにもっと興味があります。実装が異なれば、メモリのサイズも異なります(私の理解では、メモリコストはかなりの量になります)。