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

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


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

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



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


Шаман
******

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



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


Гуру
******

Группа: Админы
Сообщений: 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
Сообщение #4


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
Сообщение #5


Гуру
******

Группа: Админы
Сообщений: 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

Сообщений в этой теме
- Karl   Что сказать компилятору, чтобы он не убирал переменную   Nov 15 2006, 10:49
- - _Bill   Цитата(Karl @ Nov 15 2006, 13:49) как отм...   Nov 15 2006, 11:02
- - IgorKossak   Цитата(Karl @ Nov 15 2006, 12:49) как отм...   Nov 15 2006, 11:09
|- - Karl   Цитата(IgorKossak @ Nov 15 2006, 16:09) Ц...   Nov 15 2006, 11:20
|- - Сергей Борщ   Цитата(Karl @ Nov 15 2006, 13:20) Цитата(...   Nov 15 2006, 11:56
- - GetSmart   Для АРМов в IARе я делаю так: #pragma required = ...   Nov 15 2006, 11:43
||- - dxp   Цитата(makc @ Nov 15 2006, 20:24) Цитата(...   Nov 15 2006, 15:07
|- - Сергей Борщ   Цитата(makc @ Nov 15 2006, 15:30) Если ло...   Nov 15 2006, 16:03
|- - Karl   Цитата(Сергей Борщ @ Nov 15 2006, 21:03) ...   Nov 16 2006, 04:00
- - IgorKossak   Тогда что мешает сделать переменную просто глобаль...   Nov 16 2006, 13:34
|- - Karl   Цитата(IgorKossak @ Nov 16 2006, 18:34) Т...   Nov 20 2006, 07:53
- - arttab   а если violates? или я что то путаю?   Nov 17 2006, 02:55
- - makc   Тема раскрыта. Закрываю.   Nov 20 2006, 08:15


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

 


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


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