Когда я пишу код, я пытаюсь разделить логически делимые части программы, создав «модули». Это очень легко перейти с таких языков, как Javascript с NodeJS или Python, чтобы выполнить это. С помощью C я нашел способы сделать это с помощью шаблона, который я привел ниже. Я использую объявления статического метода с const
объявленными структурами для создания «модулей» для организации моего кода.Могу ли я заставить компилятор оптимизировать вызовы функций в структурах?
Я заметил, что стоимость вызова метода с помощью этой методики обычно составляет только одну инструкцию сборки для каждого вызова.
Вместо
movl -8(%rbp), %edx
movl -12(%rbp), %eax
movl %edx, %esi
movl %eax, %edi
call my_add_method
техника «модуль» будет генерировать
movl $my_add_method, %ecx
movl -8(%rbp), %edx
movl -12(%rbp), %eax
movl %edx, %esi
movl %eax, %edi
call *%rcx
То, что я хочу найти это способ объявления этих модулей, но есть скомпилированный вывод будет идентичен только вызвав метод по его немедленному названию.
То, что я хотел бы знать:
Есть ли способ, чтобы компилятор (GCC), либо с флагами или объявив структуры по-разному, оптимизировать код так, чтобы в результате асмовый тоже самое?
Я предполагал, что это будет simple вещь для компилятора для оптимизации, если не существует метода, почему такая оптимизация вообще невозможна? (С учетом структура является постоянной и статической)
/**
* File: main.c
* Target: x86_64-linux-gnu
* Compile: gcc main.c -S -o main
*/
#include <stdio.h>
typedef struct {
int (* const add_func)(int, int);
} MY_MOD_T;
static int my_add_method(int a, int b) {
return a+b;
}
const MY_MOD_T Module = {
.add_func = my_add_method
};
int main(void) {
int a = 5;
int b = 6;
// substitute these two lines to see the different output like above
int result = Module.add_func(a, b);
//int result = my_add_method(a, b);
printf("%d + %d = %d\n", a, b, result);
return 0;
}
Можете ли вы надежно определить разницу в производительности? –
Вы пытались использовать флаг оптимизации (-O)? Выход будет совсем другим. Попытка оптимизировать выход asm в '-O0', вероятно, является бесполезной. – Jahaja
Нет. Это не проблема производительности, просто любопытство. Я просто подумал, что это будет простая задача для оптимизации компилятора. – MatUtter