2014-10-22 2 views
0

Имеет ли доступ к полям, находящимся в глубине структуры, дополнительное время (инструкции по сборке) или же эти ячейки памяти жестко закодированы компилятором? Я хотел бы логически держать определенные вещи вместе в структуре, но хочу понять, могу ли я принять удар по производительности из-за этого.Получает ли доступ к полям в структуре больше времени?

Например, в следующем коде есть запись в s.c.d любой медленной, чем запись в d2?

typedef struct a_struct_tag { 
    uint8_t d; 
} a_struct_t; 

typedef struct my_struct_tag { 
    uint8_t a; 
    uint8_t b[8]; 
    a_struct_t c; 
} my_struct_t; 

int main() 
{ 
my_struct_t s; 
s.c.d = 3; 

a_struct_t d2; 
d2.d = 4; 
} 
+2

Почему вы не смотрите на выходную сборку? Кроме того, вы могли бы запускать некоторые простые тесты самостоятельно – UnholySheep

+0

Я бы сомневался, что любая «разница» в производительности (здесь есть) перевешивает любые вызовы IO/Database/Network или сложную математику, которую вы могли бы иметь. – crashmstr

ответ

3

Нет никакой разницы. Давайте посмотрим на немного выхода сборки из objdump -S binary:

int main() 
{ 
    40053c:  55      push %rbp 
    40053d:  48 89 e5    mov %rsp,%rbp 
    400540:  48 83 ec 30    sub $0x30,%rsp 
    400544:  64 48 8b 04 25 28 00 mov %fs:0x28,%rax 
    40054b:  00 00 
    40054d:  48 89 45 f8    mov %rax,-0x8(%rbp) 
    400551:  31 c0     xor %eax,%eax 
my_struct_t s; 
s.c.d = 3; 
    400553:  c6 45 e9 03    movb $0x3,-0x17(%rbp) 

a_struct_t d2; 
d2.d = 4; 
    400557:  c6 45 df 04    movb $0x4,-0x21(%rbp) 
} 
.... //the rest is not interesting, or at least I believe so 

Сейчас я не являюсь экспертом в сборке x86, но мы можем ясно видеть, что есть только одна инструкция для обеих команд.

И почему это так? Если у вас есть структура, которая четко определена с точки зрения ее размера, то во время процесса компиляции можно рассчитывать любое смещение. Теперь он просто «положил значение X в ячейку памяти Y».

Уровень гнездования не имеет значения.

Что касается общих руководящих принципов по отношению к настройке производительности, позвольте мне привести Дональд Кнут:

Преждевременная оптимизация является корнем всего зла.

Лучше настройте свои алгоритмы и IO, чем беспокоиться о работе компилятора. Компилятор может делать чудеса (буквально!) С точки зрения оптимизации, если вы разрешаете его с определенными флагами компиляции.

Смежные вопросы