LINUX.ORG.RU

[C] пару глупых вопросов про оптимизацию памяти

 


0

1

Приветствую Вас друзья, если можно без укора, объясните почему нигде в исходниках не замечал оптимизации:

1. char main без знака

unsigned char main (){
   ...
   if (res) return (0);
        else return (1);// да хоть 255
}

2. Если нужен цикл до 256 шагов зачем объявлять int i ?

unsigned char i;
for (i ...

3. Если нужны флаги, можно же не объявлять int переменную, а использовать структуру, типа:

struct flags {
   a:1;
   b:1;
   c:1;
   ...
};



Последнее исправление: rsavelev (всего исправлений: 2)

>unsingned char

unsigned...

1. В чем заключается оптимизация? 2. Аналогично... 3. Операции с битовыми полями платформозависимы.

encyrtid ★★★★★
()
Ответ на: комментарий от encyrtid

unsingned char

unsigned... Спасибо подправил

В чем заключается оптимизация?

Хотябы в 3 байтах, а если это под микроконтроллер

rsavelev
() автор топика

Это лишь порождает ненужную возню со значениями занимающими не весь регистр, чтение по не выровненным адресам, полезно только для 8-битных и т.п. cpu.

amaora ★★
()
Ответ на: комментарий от amaora

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

amaora ★★
()

>unsigned char main
Мда.
Да и вообще экономия на спичках. Всё равно округление до целой страницы съест любые попытки «оптимизации».

x3al ★★★★★
()

> 1. char main без знака ?

> 2. Если нужен цикл до 256 шагов зачем объявлять int i ?

кодим под 8-битный микроконтроллер? похвально.

> 3. Если нужны флаги, можно же не объявлять int переменную, а использовать структуру, типа:

дочитай главу учебника о битфилдах до конца.

arsi ★★★★★
()

1. А ничего, что многие программы возвращают отрицательные значения в качестве кода возврата? Кроме того: сколько _реальной_ памяти занимает значение, возвращаемое программой? И где ж тут оптимизация?

2. Да на здоровье. As you wish. :)

3. А сколько _реальной_ памяти займёт структура с 2, 3, 5 полями? Не думал над этим (с учётом выравнивания)? К тому же флаги и так упаковывают в одну переменную, а пользуются, как выше amaora показал.

OldFatMan
()

> Если нужен цикл до 256 шагов зачем объявлять int i ?

Потому что экономить байты на стеке нужно только в 8-битных микроконтроллерах :)

Если нужны флаги, можно же не объявлять int переменную, а использовать структуру, типа:

Ты экономишь память данных за счет объема кода.

tailgunner ★★★★★
()

1. Экономия 3 байт на программу не стоит возни. тем более, что экономии тут не будет - стандарт говорит int и вся обвязка ждёт инт.

2. На самом деле случаев, когда нужно меньше 256 итераций не так уж и много. так писать можно, но каждый раз надо думать, а не понадобится ли большее число итераций? Мало-ли что юзер введёт или программист позже изменит? Обычно 3 байта не стоят мозговых усилий.

3. это замечательно. Но есть одно «но»: как ты на битфилдах сделаешь это?

bool check(unsigned mask)
{
  if(myflags & somemaskmask)
    return 1;
  ...
}
bool is_good_enough = check(FLAG_A|FLAG_C);
legolegs ★★★★★
()

>объясните почему нигде в исходниках не замечал оптимизации:

3. Если нужны флаги, можно же не объявлять int переменную, а использовать структуру, типа:

Наверное, потому что мало исходного кода видели. Взял первый попавшийся исходник - linux-2.6.35 и без проблем нагрепал там кучу ":1" используемых как флаги.

anonymous
()
Ответ на: комментарий от legolegs

>3. это замечательно. Но есть одно «но»: как ты на битфилдах сделаешь это?

Без инкапсуляции это как раз будет выглядеть более естественно:

bool is_good_enough = var->prop_a || var->prob_c;

anonymous
()

1. Доступ к инту быстрее

2. Экономить место на стэке... Зачем?

annulen ★★★★★
()
Ответ на: комментарий от anonymous

>= var->prop_a || var->prob_c;

Ты потерял моё многоточие. Но еслиб не оно, то да, можно было бы и так написать.

legolegs ★★★★★
()

перепиши всё на ассамблере чё. самый маленький код, самый быстрый и меньше всего памяти будет жрать.

mi_estas
()

> unsigned char main ()

return value через %eax вернется, даже не через стек, где тут экономия?

использовать структуру, типа

выравнивание никто не отменял, оно все равно не менее, чем побайтовое. задрачиваться из-за нескольких бит слегка отдает расстройствами

и да, я говорю не про контроллеры

x0r ★★★★★
()
Ответ на: комментарий от OldFatMan

> А ничего, что многие программы возвращают отрицательные значения в качестве кода возврата?

Вы из винды чтоли?

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от x0r

>выравнивание никто не отменял, оно все равно не менее, чем побайтовое. задрачиваться из-за нескольких бит слегка отдает расстройствами

А ассоциации с задрачиванием вы даже не представляете какими расстройствами отдает. Скажите, вы это делаете на свой аватар?

и да, я говорю не про контроллеры

О!.. Кто-то услышал от взрослого дяди слово «контроллер». Собственной фантазии-то не хватает придумать, когда нужна экономия байтов.

anonymous
()

1. Не соответствует стандарту, и бессмысленно
2. Так будет только медленнее, и всё равно бестолку
3. Если нужны флаги, то обычно объявляют беззнаковую переменную и определяют флаги как битовые маски типа 0x00008000.

Переменные в структурах обычно стараются располагать так, чтобы между ними не было дыр выравнивания.

Иногда бывают ситуации, когда требуется экономить память даже в ущерб производительности, и тогда даже используют и счетчики в битовых структурах (см., например, valgrind).

Sorcerer ★★★★★
()

1. Потому что wait() возвращает int. и в битах больше 8 оно хранит доп. значения. на любой платформе, операции с int всегда быстрее и на ассемблерном листинге понятнее, чем с неродной битностью 2. то же самое 3. а ты скомпиль с --save-temps и посмотри ассемблерный листинг. и тебя порвёт.

mmarkk
()

почему нигде в исходниках не замечал оптимизации:

Наверное, не те исходники читал. То, что нужно только олдскульным девайсам с 1024 байтами оперативки, пишется только для олдскульных девайсов с 1024 байтами оперативки.

Miguel ★★★★★
()

>2. Если нужен цикл до 256 шагов зачем объявлять int i ?

Потому что на многих ЦПУ это не оптимизация а наоборот, 8 битные регистры есть не у всех - переменная в итоге все равно будет 32 битная например (по размеру регистра), а компилятор будет вынужден сгенерировать дополнительный код проверки на переполнение 8 бит.

anonymous
()

1. бред. 2. for(i=0;i<256;i++), так? enjoy your infinite loop! 3. уже и так всё сказали.

xydo ★★
()
Ответ на: комментарий от x0r

Было бы странно ожидать, что к ярко выраженной дебильности не прилагается неграмотность.

Вопрос № 265242   

Здравствуйте!


Скажите, пожалуйста, какие окончания имеют единицы измерения - герц, >вольт, ватт, грамм, бит, байт - в форме родительного падежа >множественного числа?




Юлия


Ответ справочной службы русского языка


Если эти слова следуют за числительными, то они имеют нулевое >окончание: пять килограмм, 220 вольт. Но без числительных используется >окончание -ов: много килограммов, нехватка гигабайтов.



Источник: gramota.ru

anonymous
()

Сначала докажи что эта оптимизация даст существенный выигрыш с конкретной программе.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.