реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Closed TopicStart new topic
> Что сказать компилятору, чтобы он не убирал переменную, если она не используется
Karl
сообщение Nov 15 2006, 10:49
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



как отменить оптимизацию для определенных переменных? Мне необходимо, чтобы проинициализировалась переменная, которая не используется в последующем коде.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Nov 15 2006, 11:02
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Karl @ Nov 15 2006, 13:49) *
как отменить оптимизацию для определенных переменных? Мне необходимо, чтобы проинициализировалась переменная, которая не используется в последующем коде.

А тогда зачем она нужна вообще?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 15 2006, 11:09
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Karl @ Nov 15 2006, 12:49) *
как отменить оптимизацию для определенных переменных? Мне необходимо, чтобы проинициализировалась переменная, которая не используется в последующем коде.

Добавьте перед её обьявлением __root
Go to the top of the page
 
+Quote Post
Karl
сообщение Nov 15 2006, 11:20
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Цитата(IgorKossak @ Nov 15 2006, 16:09) *
Цитата(Karl @ Nov 15 2006, 12:49) *

как отменить оптимизацию для определенных переменных? Мне необходимо, чтобы проинициализировалась переменная, которая не используется в последующем коде.

Добавьте перед её обьявлением __root


Не помогло... Наверное действует только на глобальные переменные
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 15 2006, 11:43
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Для АРМов в IARе я делаю так:

#pragma required = Name

где Name => переменная или процедура. Насчёт локальных переменных не пробывал. Может сработает, а может и нет.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 15 2006, 11:56
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 15 2006, 13:06
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Для локальных переменных память выделяется в стеке.
И если локальная переменная не используется, нет способа заставить компилятор выделять под неё память. Разве что какие-нибудь трюки, которых я не знаю.
Go to the top of the page
 
+Quote Post
makc
сообщение Nov 15 2006, 13:30
Сообщение #8


Гуру
******

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



Цитата(IgorKossak @ Nov 15 2006, 16:06) *
Для локальных переменных память выделяется в стеке.
И если локальная переменная не используется, нет способа заставить компилятор выделять под неё память. Разве что какие-нибудь трюки, которых я не знаю.


Если локальная переменная объявлена как static, то память для нее будет выделяться либо в .data, либо в .bss, но никак ни в стеке. А если ее кроме того сделать volatile, то по идее компилятор должен будет ее сохранить.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 15 2006, 13:41
Сообщение #9


Adept
******

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



Цитата(makc @ Nov 15 2006, 19:30) *
...сделать volatile, то по идее компилятор должен будет ее сохранить.

Даже не по идее, а просто обязан выделить память в стеке. И выделяет. Никаких трюков.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
makc
сообщение Nov 15 2006, 14:24
Сообщение #10


Гуру
******

Группа: Админы
Сообщений: 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
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 15 2006, 15:07
Сообщение #11


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), так это бесспорно - это по Стандарту. Мой пост скорее был поддакиванием Вашему smile.gif и относился к фразе уважаемого IgorKossak:

Цитата
И если локальная переменная не используется, нет способа заставить компилятор выделять под неё память. Разве что какие-нибудь трюки, которых я не знаю.


Прошу прощения, что ввел в заблуждение.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 15 2006, 16:03
Сообщение #12


Гуру
******

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



Цитата(makc @ Nov 15 2006, 15:30) *
Если локальная переменная объявлена как static, то память для нее будет выделяться либо в .data, либо в .bss, но никак ни в стеке. А если ее кроме того сделать volatile, то по идее компилятор должен будет ее сохранить.
А сохранить же ее исходно и не требовалось. Требовалось проинициализировать. С этим справляется volatile и без static


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Karl
сообщение Nov 16 2006, 04:00
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Цитата(Сергей Борщ @ Nov 15 2006, 21:03) *
Цитата(makc @ Nov 15 2006, 15:30) *

Если локальная переменная объявлена как static, то память для нее будет выделяться либо в .data, либо в .bss, но никак ни в стеке. А если ее кроме того сделать volatile, то по идее компилятор должен будет ее сохранить.
А сохранить же ее исходно и не требовалось. Требовалось проинициализировать. С этим справляется volatile и без static

smile.gif
Уточню вопрос. volatile безусловно работает. Об этом я всегда знал. Но мне это не подходит. Мне необхо добиться максимальной скорости выполнения подпрограммы. Поэтому сохранение переменной в стеке крайне нежелательно. Дальше. Есть кусок кода, который компилируется неоптимально:
u32 summ;
s16 kan
....
kan-=(summ>>13);

Тут компилятор перед вычитанием делает сдвиг на 13 вправо. Гораздо быстрее было бы сделать сдвиг на 3 влево и взять два старших байта. Вот это я заставить компилятор сделать никак не могу. Хотел сделать асм вставку, но тогда просто не инициализируется переменная summ. Отключение оптимизации и тупое

u32 tmp = summ<<3;
kan-=tmp>>16;

тоже не помогает. Генерится тот же код, что и в первом случае. Вот в чем моя проблема.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 16 2006, 13:34
Сообщение #14


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Тогда что мешает сделать переменную просто глобальной если под неё нужно выделять память не в стеке?
В этом случае она будет отличаться от статической с атрибутами static volatile разве что областью видимости.
Подозреваю, что проблема носит скорее академический, нежели прикладной интерес.
Go to the top of the page
 
+Quote Post
arttab
сообщение Nov 17 2006, 02:55
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



а если violates? или я что то путаю?


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 23:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01487 секунд с 7
ELECTRONIX ©2004-2016