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

 
 
> Что сказать компилятору, чтобы он не убирал переменную, если она не используется
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
dxp
сообщение Nov 15 2006, 15:07
Сообщение #6


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

Сообщений в этой теме
- 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
|- - Сергей Борщ   Цитата(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 Текстовая версия Сейчас: 22nd July 2025 - 18:37
Рейтинг@Mail.ru


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