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

 
 
 
Reply to this topicStart new topic
> С++ или С, что лучше для LPC?
YChebisheva
сообщение Jan 29 2009, 11:57
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 9-01-09
Пользователь №: 43 070



Не хотелось влезать в столь жаркую беседу со своими глупыми вопросами, но придется 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?

Модератор. Данная ветка была выделена в отдельный топик из другой темы по просьбе ее (другой темы) топикстартера.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 29 2009, 12:18
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Да, тяжелый случай.

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


Будто бы "просто подставляемые значения" в программу поступают из внеземного эфира? Они тоже где-то должны "лежать", т.е. занимать место в памяти.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 29 2009, 12:50
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(YChebisheva @ Jan 29 2009, 14:57) *

По пунктам
1. #define CP_BUFSIZE  4095
2. На быстродействие short повлияет
3. Все равно, что статический, что через malloc, кроме случая
Код
a = array[2];
- компилятор это соптимизирует, если у нас статический массив.
Go to the top of the page
 
+Quote Post
YChebisheva
сообщение Jan 29 2009, 12:51
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 9-01-09
Пользователь №: 43 070



sergeeff, вопрос в другом - когда именно они подставляются? Или может я ошибаюсь и неправильно понимаю, как в простом си используется define? И что, если я определил хоть 10 тысяч дефайнов, в памяти, после линковки они занимать место не будут?
_Pasha, а как объявить строку-чар константу?

Сообщение отредактировал YChebisheva - Jan 29 2009, 12:53
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 29 2009, 13:10
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(YChebisheva @ Jan 29 2009, 15:51) *
_Pasha, а как объявить строку-чар константу?

Так, как у Вас определено изначально. smile.gif
static const char CP_CANCEL[] = "CANCEL";
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jan 29 2009, 15:45
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



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


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

#define ABC "Vasia Pupkin"

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

static const char - место занимать будет даже если не используется. Правда, мож оптимизатор выбросит?


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 29 2009, 15:49
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

Код
#define SIZE  10
char a[SIZE]; // <-char a[10]


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 29 2009, 15:50
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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


Что-то вы про какие-то странные вещи спрашиваете. define назначает некоторому символическому имени некое значение и все!!! Чего вы там уж собираетесь такое в define засунуть - это ваше личное дело. Это все манипуляции до компиляции, и тем более до линкера. Вы как-то повнятнее спросите, а лучше с примером.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 29 2009, 15:59
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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 - может оказаться и быстрее, зависит от компилятора.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dimka76
сообщение Feb 20 2009, 07:14
Сообщение #10


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(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 проводил наглядный эксперимент

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


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post

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

 


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


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