次のような動的配列を作成しました。
#include <stdlib.h>
typedef struct {
size_t capacity;
size_t len;
} __dynarray_header;
void* dynarray_new() {
__dynarray_header* header = malloc(sizeof(__dynarray_header));
header->capacity = 0;
header->len = 0;
return header + 1;
}
動的配列は操作でアクセスできます[]
。サイズを変更するときは、__dynarray_header*)array - 1
容量と長さの情報を取得するために使用できます。
このアイデアは小さなテストで機能します。ただし、GCC は、strict-aliasing を壊すことについて警告します。
-fno-strict-aliasing
また、コンパイラ オプションなしで (-O3
最適化ありで)いくつかの大規模なプロジェクトの segfault も見つかりました。
strict-aliasing とは何か、私のコードが strict-aliasing を破る理由を知っています。
[]
私の質問は次のとおりです。操作と動的サイズ変更の両方をサポートする動的配列を実装するより良い方法はありますか?
追加:
この動的配列を使用したデモ プログラム:
int* arr = dynarray_new();
arr = dynarray_resize(sizeof(int) * 2);
arr[0] = 1;
arr[1] = 2;
arr = dynarray_resize(sizeof(int) * 4);
arr[2] = 3;
arr[3] = 4;
dynarray_free(arr);