私は構造体を広範囲に使用してきましたが、特に値が構造体へのポインターである場所*value
の代わりに、最初のメンバーは安全ですか?value->first_value
first_value
*value
また、アラインメントのためにサイズが保証されていないことに注意してください。アーキテクチャ/レジスタのサイズに基づくアラインメント値は何ですか?
より高速な実行のためにデータ/コードを調整します。コンパイラにこれを行わないように指示できますか? サイズなど、構造体に関する特定のことを保証できるのではないでしょうか?
メンバーのオフセットを見つけるために構造体メンバーでポインター演算を行う-
場合+
、ビッグ エンディアンの場合はリトル エンディアンの場合と考えますか、それともコンパイラに依存するだけですか?
malloc(0) は実際に何を割り当てますか?
次のコードは、教育/発見を目的としたものであり、製品品質を意図したものではありません。
#include <stdlib.h>
#include <stdio.h>
int main()
{
printf("sizeof(struct {}) == %lu;\n", sizeof(struct {}));
printf("sizeof(struct {int a}) == %lu;\n", sizeof(struct {int a;}));
printf("sizeof(struct {int a; double b;}) == %lu;\n", sizeof(struct {int a; double b;}));
printf("sizeof(struct {char c; double a; double b;}) == %lu;\n", sizeof(struct {char c; double a; double b;}));
printf("malloc(0)) returns %p\n", malloc(0));
printf("malloc(sizeof(struct {})) returns %p\n", malloc(sizeof(struct {})));
struct {int a; double b;} *test = malloc(sizeof(struct {int a; double b;}));
test->a = 10;
test->b = 12.2;
printf("test->a == %i, *test == %i \n", test->a, *(int *)test);
printf("test->b == %f, offset of b is %i, *(test - offset_of_b) == %f\n",
test->b, (int)((void *)test - (void *)&test->b),
*(double *)((void *)test - ((void *)test - (void *)&test->b))); // find the offset of b, add it to the base,$
free(test);
return 0;
}
呼び出しgcc test.c
に続いて、./a.out
私はこれを取得します:
sizeof(struct {}) == 0;
sizeof(struct {int a}) == 4;
sizeof(struct {int a; double b;}) == 16;
sizeof(struct {char c; double a; double b;}) == 24;
malloc(0)) returns 0x100100080
malloc(sizeof(struct {})) returns 0x100100090
test->a == 10, *test == 10
test->b == 12.200000, offset of b is -8, *(test - offset_of_b) == 12.200000
更新 これは私のマシンです:
gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
uname -a
Darwin MacBookPro 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386