|
Что сказать компилятору, чтобы он не убирал переменную, если она не используется |
|
|
|
Nov 15 2006, 11:02
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Karl @ Nov 15 2006, 13:49)  как отменить оптимизацию для определенных переменных? Мне необходимо, чтобы проинициализировалась переменная, которая не используется в последующем коде. А тогда зачем она нужна вообще?
|
|
|
|
|
Nov 15 2006, 11:20
|
Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429

|
Цитата(IgorKossak @ Nov 15 2006, 16:09)  Цитата(Karl @ Nov 15 2006, 12:49)  как отменить оптимизацию для определенных переменных? Мне необходимо, чтобы проинициализировалась переменная, которая не используется в последующем коде.
Добавьте перед её обьявлением __root Не помогло... Наверное действует только на глобальные переменные
|
|
|
|
|
Nov 15 2006, 11:56
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Karl @ Nov 15 2006, 13:20)  Цитата(IgorKossak @ Nov 15 2006, 16:09)  Цитата(Karl @ Nov 15 2006, 12:49)  как отменить оптимизацию для определенных переменных? Мне необходимо, чтобы проинициализировалась переменная, которая не используется в последующем коде.
Добавьте перед её обьявлением __root Не помогло... Наверное действует только на глобальные переменные Если локальная, объявите ее как volatile.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 15 2006, 13:30
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(IgorKossak @ Nov 15 2006, 16:06)  Для локальных переменных память выделяется в стеке. И если локальная переменная не используется, нет способа заставить компилятор выделять под неё память. Разве что какие-нибудь трюки, которых я не знаю. Если локальная переменная объявлена как static, то память для нее будет выделяться либо в .data, либо в .bss, но никак ни в стеке. А если ее кроме того сделать volatile, то по идее компилятор должен будет ее сохранить.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Nov 15 2006, 14:24
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(dxp @ Nov 15 2006, 16:41)  Цитата(makc @ Nov 15 2006, 19:30)  ...сделать volatile, то по идее компилятор должен будет ее сохранить.
Даже не по идее, а просто обязан выделить память в стеке. И выделяет. Никаких трюков. Простой эксперимент: arm-elf-gcc --version : Код arm-elf-gcc (GCC) 4.1.0 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Два исходника: Код int f(int a, int b) { static volatile int c; return a+b; } и Код int f(int a, int b) { int c; return a+b; } arm-elf-objdump -x test1.o : Цитата Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000024 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .data 00000000 00000000 00000000 00000058 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000004 00000000 00000000 00000058 2**2 ALLOC 3 .comment 00000012 00000000 00000000 00000058 2**0 CONTENTS, READONLY SYMBOL TABLE: 00000000 l df *ABS* 00000000 test.c 00000000 l d .text 00000000 .text 00000000 l d .data 00000000 .data 00000000 l d .bss 00000000 .bss 00000000 l .bss 00000000 c.1237 00000000 l d .comment 00000000 .comment 00000000 g F .text 00000024 f arm-elf-objdump -x test2.o : Цитата Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000024 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .data 00000000 00000000 00000000 00000058 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 00000058 2**0 ALLOC 3 .comment 00000012 00000000 00000000 00000058 2**0 CONTENTS, READONLY SYMBOL TABLE: 00000000 l df *ABS* 00000000 test.c 00000000 l d .text 00000000 .text 00000000 l d .data 00000000 .data 00000000 l d .bss 00000000 .bss 00000000 l d .comment 00000000 .comment 00000000 g F .text 00000024 f Вывод - static volatile int - выделяется не в стеке, а в .bss и сохраняется компилятором даже если не используется в функции. Что и требовалось. Хотя и просто static int тоже остается.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Nov 15 2006, 15:07
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(makc @ Nov 15 2006, 20:24)  Цитата(dxp @ Nov 15 2006, 16:41)  Цитата(makc @ Nov 15 2006, 19:30)  ...сделать volatile, то по идее компилятор должен будет ее сохранить.
Даже не по идее, а просто обязан выделить память в стеке. И выделяет. Никаких трюков. Простой эксперимент: arm-elf-gcc --version : [...] Вывод - static volatile int - выделяется не в стеке, а в .bss и сохраняется компилятором даже если не используется в функции. Что и требовалось. Хотя и просто static int тоже остается. Да я ж разве спорю. Я вообще не про это. Я про то, что, если локальную нестатическую переменную объявить как volatile, то компилятор никуда ее не уберет, даже если она не используется. Т.е. никаких трюков не требуется для того, чтобы компилятор ее оставил. А то, что статические объекты (как и глобальные) живут в static storage duration memory (которая в Вашем компиляторе называется .bss), так это бесспорно - это по Стандарту. Мой пост скорее был поддакиванием Вашему  и относился к фразе уважаемого IgorKossak: Цитата И если локальная переменная не используется, нет способа заставить компилятор выделять под неё память. Разве что какие-нибудь трюки, которых я не знаю. Прошу прощения, что ввел в заблуждение.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Nov 16 2006, 04:00
|
Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429

|
Цитата(Сергей Борщ @ Nov 15 2006, 21:03)  Цитата(makc @ Nov 15 2006, 15:30)  Если локальная переменная объявлена как static, то память для нее будет выделяться либо в .data, либо в .bss, но никак ни в стеке. А если ее кроме того сделать volatile, то по идее компилятор должен будет ее сохранить.
А сохранить же ее исходно и не требовалось. Требовалось проинициализировать. С этим справляется volatile и без static Уточню вопрос. volatile безусловно работает. Об этом я всегда знал. Но мне это не подходит. Мне необхо добиться максимальной скорости выполнения подпрограммы. Поэтому сохранение переменной в стеке крайне нежелательно. Дальше. Есть кусок кода, который компилируется неоптимально: u32 summ; s16 kan .... kan-=(summ>>13); Тут компилятор перед вычитанием делает сдвиг на 13 вправо. Гораздо быстрее было бы сделать сдвиг на 3 влево и взять два старших байта. Вот это я заставить компилятор сделать никак не могу. Хотел сделать асм вставку, но тогда просто не инициализируется переменная summ. Отключение оптимизации и тупое u32 tmp = summ<<3; kan-=tmp>>16; тоже не помогает. Генерится тот же код, что и в первом случае. Вот в чем моя проблема.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|