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

 
 
> Размер структур, стек и куча, Максимальный размер структур, их копирование, стек и куча
kolobochishe
сообщение Dec 22 2015, 16:07
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Пишем программу для нового прибора. Коллега создает вот такие структуры:
Код
typedef struct    {
    REC_HEADER Header;
    WORD NoPT;
    WORD NoPL;
    WORD NoAD;
    WORD StationID;
    WORD ModelID;
    WORD ManufactID;
    char Ident[9];
    char Descript[41];
    WORD StatTime;
    WORD NoFR;
    WORD NoRT;
    WORD NoBL;
    BYTE NoKY;
    BYTE NoPR;
    BYTE UnitsCal[7];
    float Units0dB[7];
    char KeyId[3][5];
    char KeyDescr[3][41];
    BYTE KeyGrade[3];
    float Factor[3];
    BYTE KeyTStamp[3][8];
    float KeyNom[3];
    float RPM[3];
    char KeyNotes[3][241];
    char PrId[12][9];
    char PrDescr[12][41];
    char Units[12][7];
    BYTE PrGrade[12];
    BYTE PrTStamp[12][8];
    float PrNom[12];
    float PrVal[12];
    char PrNotes[12][241];
                } RTN;


и вот в таком вот месте программа "виснет"
Код
void make_TA(void)
{
    BYTE    get_status(BYTE);

    RTN train=TRAIN; // ТУТ ЗАВИСАЕТ


Увеличил размер стека и все заработало. Был 3кБ сделал 10кБ. Правда, из SCRTACHPAD пришлось перенести в L1 из-за размера.
Контроллер Blackfin BF-548.

Теперь вопросы:
1. Как вы контролируете переполнение стека?
2. Какой размер считаете оптимальным?
3. В какой памяти его лучше располагать?
4. Как реально происходит приравнивание структур? Это спрятанное от глаз memcpy? И используется ли при этом динамическое выделение памяти?
5. Мириться ли с тем, что коллега создает такие огромные структуры или надо сменить подход? Можно ли их располагать в функции или лучше глобально?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SlavaV
сообщение Dec 23 2015, 06:52
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



Вообще конструкция тип НовыйОбъект = Объект
говорит создать временный объект типа "тип" (вот он видимо и создаётся на стеке) и скопировать его в НовыйОбъект (именно скопировать, если не перегружен оператор= происходит почленное копирование)
PS это утверждение верно для С++ так как там структуры и классы одна сущность только с разными свойствами по умолчанию

Другого использование стека в приведённом коде я не вижу

PPS все функции работы с памятью memcpy malloc работают с кучей
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 23 2015, 08:14
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(SlavaV @ Dec 23 2015, 12:52) *
Вообще конструкция тип НовыйОбъект = Объект
говорит создать временный объект типа "тип" (вот он видимо и создаётся на стеке) и скопировать его в НовыйОбъект (именно скопировать, если не перегружен оператор= происходит почленное копирование)

Не обязательно.
Если TRAIN - имеет тип RTN и перегружен оператор присваивания:
RTN & RTN::operator =(RTN &);
то (имхо) компилятор сделает вызов конструктора по умолчанию RTN::RTN(), а затем для созданного объекта вызовет этот перегруженный оператор присваивания: train(TRAIN)
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Dec 23 2015, 08:29
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



Цитата(jcxz @ Dec 23 2015, 17:14) *
Не обязательно.
Если TRAIN - имеет тип RTN и перегружен оператор присваивания:
RTN & RTN::operator =(RTN &);
то (имхо) компилятор сделает вызов конструктора по умолчанию RTN::RTN(), а затем для созданного объекта вызовет этот перегруженный оператор присваивания: train(TRAIN)


вот этот объект и создаётся на стеке (вернее в автоматической памяти, а она обычно на стеке)

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

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- kolobochishe   Размер структур, стек и куча   Dec 22 2015, 16:07
- - Сергей Борщ   1) Заполнением стека константой перед запуском про...   Dec 22 2015, 16:39
|- - kolobochishe   Цитата(Сергей Борщ @ Dec 22 2015, 22:39) ...   Dec 22 2015, 17:08
|- - AlexandrY   Цитата(kolobochishe @ Dec 22 2015, 19:08)...   Dec 22 2015, 21:03
||- - kolobochishe   Цитата(AlexandrY @ Dec 23 2015, 02:03) .....   Dec 23 2015, 09:08
||- - AlexandrY   Цитата(kolobochishe @ Dec 23 2015, 11:08)...   Dec 23 2015, 09:21
||- - kolobochishe   Цитата(AlexandrY @ Dec 23 2015, 14:21) Ну...   Dec 23 2015, 09:35
|- - ASN   jcxz Как-то работали с профессиональным программис...   Dec 23 2015, 11:27
|- - jcxz   Цитата(ASN @ Dec 23 2015, 17:27) Как-то р...   Dec 23 2015, 13:12
- - quarter   при вызове Си-шной функции все параметры, которые ...   Dec 22 2015, 16:55
- - jcxz   Цитата(kolobochishe @ Dec 22 2015, 22:07)...   Dec 23 2015, 05:45
- - psL   Цитата(kolobochishe @ Dec 22 2015, 19:07)...   Dec 23 2015, 06:44
|- - Сергей Борщ   Цитата(psL @ Dec 23 2015, 09:44) у вас в ...   Dec 23 2015, 09:10
|- - jcxz   Цитата(Сергей Борщ @ Dec 23 2015, 15:10) ...   Dec 23 2015, 09:27
|- - psL   Цитата(Сергей Борщ @ Dec 23 2015, 12:10) ...   Dec 23 2015, 09:27
|- - AlexandrY   Цитата(SlavaV @ Dec 23 2015, 08:52) PPS в...   Dec 23 2015, 06:58
- - sigmaN   Кажется такие вопросы решаются выработкой специфик...   Jan 9 2016, 11:21


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

 


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


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