Flexible array member (FAM)은 C99 표준에 도입된 기능으로 구조체의 마지막 멤버에 길이 없는 배열을 선언해 사용할 수 있다.
해당 방식은 구조체 뒤에 가변 길이 데이터를 붙여 한 번에 할당할 때 사용한다.
![]()
위는 FAM 방식과 포인터 방식을 비교한 사진이다.
FAM 방식은 header(len+type)와 payload가 연속 메모리에 배치되므로 같은 캐시라인에 함께 실릴 확률이 높다.
반면, 포인터 방식은 header와 payload가 분리되어 있어 payload 접근 시 추가 메모리 라인/페이지 접근이 발생할 확률이 높다.
결과적으로 FAM은 캐시 locality 측면에서 유리하며, 할당/해제도 1회로 줄일 수 있다.
(포인터 방식은 구조체 할당 + payload 할당 2번을 해야함)
struct swap_info_struct {
…
spinlock_t lock;
struct work_struct discard_work;
struct swap_cluster_list discard_clusters;
struct plist_node avail_lists[];
};
리눅스 커널의 swap_info_struct에서도 FAM을 확인할 수 있는데, NUMA node의 개수만큼 필요한 링크 노드를 담기 위해 사용되었다.
(각 링크 노드는 swap_avail_heads에 연결된다.)