Оптимизация массива GCC - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть процесс только с main () и таблица поиска, которая в основном пуста:

    int arr[10] = {0, 0, 0, 0, 1, 0, 0, 1, 0, 0};

Когда я помещаю этот массив в глобальную область за пределами main () и компилирую с gcc -O2 file.c,Я получаю следующий исполняемый файл:

    bash# size a.out
       text    data     bss     dec     hex filename
       1135     616       8    1759     6df a.out

Когда я помещаю этот массив в функцию main () и компилирую с gcc -O2 file.c, я получаю следующий исполняемый файл:

    bash# size a.out
       text    data     bss     dec     hex filename
       1135     560       8    1703     6a7 a.out

Затем яизмените размер массива на 10000 без изменения содержимого и повторите тест.На этот раз результаты:

За пределами main ():

    bash# size a.out
       text    data     bss     dec     hex filename
       1135   40576       8   41719    a2f7 a.out

Внутри main ():

    bash# size a.out
       text    data     bss     dec     hex filename
       1135     560       8    1703     6a7 a.out

Почему оптимизация не работает, когда массивв глобальном пространстве.Есть ли способ сохранить большую в основном пустую справочную таблицу в глобальной области и при этом оптимизировать ее?

1 Ответ

0 голосов
/ 28 ноября 2018
/*have it start emtpy so it can go into .bss*/
int arr[10000];

//__attribute__((constructor))
void arr__init(void)
{
    //set the ones
    arr[4]=1; arr[7]=1; 
}

int main()
{
    //call the initializer
    //(or uncomment the constructor attr to have it called before main automatically (nonstandard))
    arr__init();
    return arr[4]+arr[7]+arr[2];
}

size вызов файла объекта:

text       data     bss     dec     hex filename
148       0   40000   40148    9cd4 a.out
...