Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: С++ или С
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
YChebisheva
Не хотелось влезать в столь жаркую беседу со своими глупыми вопросами, но придется smile.gif
Раньше писала под винду, на крайняк под дос в bc 3.1. Сейчас пишу в Cross Studio для LPC2214. Возникла непонятки:
мне говорили, что без крайней необходимости не стоит писать в с++, лучше в с.

У меня есть хедер с кучей констант. Был написал как для с++ как
Код
const int  CP_BUFSIZE        = 4095;
const char CP_CANCEL[]     = "CANCEL";
Для си переписала так:
Код
static const char  CP_BUFSIZE         = 4095;
static const char  CP_CANCEL[]       = "CANCEL";
Правильно ли это? Будет ли они занимать место? или подставляться просто значения как при define будут?

Потом компилю, смотрю memory usage: показывает свободно 4.4 Кб, делаю простенькую прогу
Код
char *s = NULL;
int k = 600;
do {
    printf("malloc %i bytes...", k);
    s = (char*) malloc(k++);
    if (s) {
            printf("ok\n");
            free(s);
           }
    else printf("err\n");
   }
while (s);
printf("exit!\n");
return 1;

Она уже после 621 байта выделить не может. Как объяснить?

Повлияет ли быстродействие, когда я для экономии, вместо массива int, объявлю массив unsigned short int? при условии, что реально я там буду юзать данные <= 65535.
А так же повлияет ли на скорость работы, когда буду писать-читать данные или из статического массива или из куска данных, выделенных malloc?

Модератор. Данная ветка была выделена в отдельный топик из другой темы по просьбе ее (другой темы) топикстартера.
sergeeff
Да, тяжелый случай.

Цитата
Будет ли они занимать место? или подставляться просто значения как при define будут?


Будто бы "просто подставляемые значения" в программу поступают из внеземного эфира? Они тоже где-то должны "лежать", т.е. занимать место в памяти.
_Pasha
Цитата(YChebisheva @ Jan 29 2009, 14:57) *

По пунктам
1. #define CP_BUFSIZE  4095
2. На быстродействие short повлияет
3. Все равно, что статический, что через malloc, кроме случая
Код
a = array[2];
- компилятор это соптимизирует, если у нас статический массив.
YChebisheva
sergeeff, вопрос в другом - когда именно они подставляются? Или может я ошибаюсь и неправильно понимаю, как в простом си используется define? И что, если я определил хоть 10 тысяч дефайнов, в памяти, после линковки они занимать место не будут?
_Pasha, а как объявить строку-чар константу?
_Pasha
Цитата(YChebisheva @ Jan 29 2009, 15:51) *
_Pasha, а как объявить строку-чар константу?

Так, как у Вас определено изначально. smile.gif
static const char CP_CANCEL[] = "CANCEL";
A. Fig Lee
Цитата(YChebisheva @ Jan 29 2009, 07:51) *
sergeeff, вопрос в другом - когда именно они подставляются? Или может я ошибаюсь и неправильно понимаю, как в простом си используется define? И что, если я определил хоть 10 тысяч дефайнов, в памяти, после линковки они занимать место не будут?
_Pasha, а как объявить строку-чар константу?


#define - директива прекомпилятора.
Место занимать не должно.
Например

#define ABC "Vasia Pupkin"

если нигде в теле программы ABC нет, значит и место занимать не будет

static const char - место занимать будет даже если не используется. Правда, мож оптимизатор выбросит?
Сергей Борщ
Цитата(YChebisheva @ Jan 29 2009, 14:51) *
когда именно они подставляются? Или может я ошибаюсь и неправильно понимаю, как в простом си используется define? И что, если я определил хоть 10 тысяч дефайнов, в памяти, после линковки они занимать место не будут?
Подставляются на этапе компиляции. Да хоть 100000 дефайнов - происходит простая текстовая подстановка

Код
#define SIZE  10
char a[SIZE]; // <-char a[10]
sergeeff
Цитата(YChebisheva @ Jan 29 2009, 15:51) *
sergeeff, вопрос в другом - когда именно они подставляются? Или может я ошибаюсь и неправильно понимаю, как в простом си используется define? И что, если я определил хоть 10 тысяч дефайнов, в памяти, после линковки они занимать место не будут?
_Pasha, а как объявить строку-чар константу?


Что-то вы про какие-то странные вещи спрашиваете. define назначает некоторому символическому имени некое значение и все!!! Чего вы там уж собираетесь такое в define засунуть - это ваше личное дело. Это все манипуляции до компиляции, и тем более до линкера. Вы как-то повнятнее спросите, а лучше с примером.
Сергей Борщ
Цитата(YChebisheva @ Jan 29 2009, 13:57) *
мне говорили, что без крайней необходимости не стоит писать в с++, лучше в с.
Глупости. Если только это не связано с организационными моментами. Типа "в команде больше никто плюсов не знает".
Цитата(YChebisheva @ Jan 29 2009, 13:57) *
У меня есть хедер с кучей констант. Был написал как для с++ как
Код
const int  CP_BUFSIZE        = 4095;
const char CP_CANCEL[]     = "CANCEL";
Для си переписала так:
Код
static const char  CP_BUFSIZE         = 4095;
static const char  CP_CANCEL[]       = "CANCEL";
Правильно ли это? Будет ли они занимать место?
Нет. Будут. Надо так:
Код
<файл>.h:
#define  CP_BUFSIZE 4095
extern const char *CP_CANCEL;

<файл>.c:
const char  CP_CANCEL[] = "CANCEL";
Цитата(YChebisheva @ Jan 29 2009, 13:57) *
Повлияет ли быстродействие, когда я для экономии, вместо массива int, объявлю массив unsigned short int? при условии, что реально я там буду юзать данные <= 65535.
Вопрос сложный. Зависит от архитектуры и системы команд процессора. Быстродействие может упасть, а может остаться таким же.
Цитата(YChebisheva @ Jan 29 2009, 13:57) *
А так же повлияет ли на скорость работы, когда буду писать-читать данные или из статического массива или из куска данных, выделенных malloc?
Опять же зависит от системы команд. Для AVR скорее всего будет медленнее, для PC - нет, для ARM - может оказаться и быстрее, зависит от компилятора.
dimka76
Цитата(YChebisheva @ Jan 29 2009, 14:57) *
У меня есть хедер с кучей констант. Был написал как для с++ как

надо не
Код
static const char  CP_BUFSIZE = 4095;

а
Код
static const int  CP_BUFSIZE = 4095;

Цитата(YChebisheva @ Jan 29 2009, 14:57) *
Правильно ли это? Будет ли они занимать место? или подставляться просто значения как при define будут?

смотрите http://electronix.ru/forum/index.php?s=&am...st&p=389309
там dxp проводил наглядный эксперимент

Модератор. Вместо цитирования столь объемного сообщения, можно нужно было дать ссылку не на ветку обсуждения, а на конкретное цитируемое сообщение пользователя.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.