|
Что сказать компилятору, чтобы он не убирал переменную, если она не используется |
|
|
|
 |
Ответов
|
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: Цитата И если локальная переменная не используется, нет способа заставить компилятор выделять под неё память. Разве что какие-нибудь трюки, которых я не знаю. Прошу прощения, что ввел в заблуждение.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|