У меня есть связанный список, в котором хранятся группы настроек для моего приложения:
typedef struct settings {
struct settings* next;
char* name;
char* title;
char* desc;
char* bkfolder;
char* srclist;
char* arcall;
char* incfold;
} settings_row;
settings_row* first_profile = { 0 };
#define SETTINGS_PER_ROW 7
Когда я загружаю значения в эту структуру, я не хочу называть все элементы. Я бы предпочел рассматривать его как именованный массив - значения загружаются по порядку из файла и постепенно помещаются в структуру. Затем, когда мне нужно использовать значения, я получаю к ним доступ по имени.
//putting values incrementally into the struct
void read_settings_file(settings_row* settings){
char* field = settings + sizeof(void*);
int i = 0;
while(read_value_into(field[i]) && i++ < SETTINGS_PER_ROW);
}
//accessing components by name
void settings_info(settings_row* settings){
printf("Settings 'profile': %s\n", settings.title);
printf("Description: %s\n", settings.desc);
printf("Folder to backup to: %s\n", settings.bkfolder);
}
Но мне интересно, так как это все указатели (и в этой структуре будут только указатели), добавит ли компилятор заполнение к любому из этих значений? Они гарантированно находятся в таком порядке и не имеют ничего между значениями? Будет ли мой подход работать иногда, но периодически сбоит?
редактировать для уточнения
Я понимаю, что компилятор может дополнять любые значения структуры - но, учитывая природу структуры (структуры указателей), я подумал, что это не может быть проблемой. Поскольку наиболее эффективный способ адресации данных для 32-битного процессора - это 32-битные блоки, именно так компилятор добавляет значения в структуру (т. Е. Int, short, int в структуре добавляют 2 байта заполнения после короткого , чтобы превратить его в 32-битный блок, и выровнять следующее int со следующим 32-битным блоком). Но поскольку 32-разрядный процессор использует 32-разрядные адреса (а 64-разрядный процессор использует 64-разрядные адреса (я думаю)), заполнение будет совершенно ненужным, поскольку все значения структуры (адреса, которые эффективны по своей природе) в идеальных 32-битных чанках?
Я надеюсь, что некоторые гуру представления памяти / поведения компилятора могут пролить некоторый свет на то, будет ли у компилятора когда-нибудь причина дополнять эти значения