Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

Crazy_Shrike



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопросы по программированию на C/С++

 
  • Справочники, книги
  • Выбор IDE (среды программирования)
     
    Постарайтесь дать как можно больше информации о возникшей проблеме - это в конце концов в ваших же интересах чтобы вам помогли.

    Решения конкретных задач собираются и обсуждаются в теме Задачи по C/С++ .

    Прежде чем просить помощи в задании...
    Если позарез надо и вы даже готовы заплатить

    Как правильно задавать вопросы, если вы хотите получить ответ.

    Полезные ссылки:
    C++(eng)

  • Всего записей: 241 | Зарегистр. 25-03-2004 | Отправлено: 13:37 06-05-2004 | Исправлено: AZJIO, 19:45 12-05-2014
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MihailM

    Цитата:
    Кстати а что там не так или неправильно ?
    в своём коде ты можешь допускать (и все допускают) ошибки...
    но вот отдавать юзверю _неправильную_ инструкцию использования своей проги -- недопустимо...
    собссно, поэтому этот вопрос здесь и возник...
     
    моё глубое ХО -- хрен оспоришь :)

    Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 15:57 05-03-2022
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день. Вопрос про выделение памяти в стеке. Компилятор GCC, пишу следующий код:

    Код:
    void test(void)
    {
          int i =1;
      printf("i=%d\n",i);
      {
          puts("a");
          {
          char buf[4096]={0};
          buf[0]=1;
          puts("a");
          }
          puts("a");
          {
          char buf[4096]={0};
          buf[0]=2;
          puts("a");
          }
          puts("a");
      }
      return;
    }
     
    Правильно ли я понимаю, что между блоками, где пропадает видимость массива buf[] память не возвращается стеку (в общем, это ухищрение бесполезно с точки зрения возврата памяти), а возврат будет по факту только при выходе из функции test()?

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 11:24 26-05-2022
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc
     
    скорее всего так оно и есть, ед на что можно рассчитывать, это то что оптимизирующий компилятор во втором случае будет ссылаться на ту же область. подробнее надо смотреть асм-код...
     
    а зачем тебе так?
    тем более если нужен тотал контроль всегда можно воспользоваться вечными malloc()/free()...

    Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 12:08 26-05-2022 | Исправлено: akaGM, 12:10 26-05-2022
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    akaGM (12:08 26-05-2022)
    Цитата:
    подробнее надо смотреть асм-код

    Я смотрел за регистром ESP и SS, вообще в ассемблере не сильно шарю, но по значению ESP получалось выделение в той же области, если строчки идентичные, и в новой области, если во втором случае размер отличается.
     
    Про выделение из кучи - знаю, просто у меня в лог тогда мусорит (там идёт отладка операций из кучи), вот и стараюсь небольшие буфера создавать в стеке. Просто надо знать, когда ухищрения бесполезны и только усложняют код.
     
    alloca() точно в конце функции высвобождает память, читал в документации. Тут он похоже неявно используется.
     
    Скорее всего, это касается выделения памяти всех автоматических переменных, единственное исключение  - это вызов деструкторов при выходе из области видимости и недоступность данных.
     
    Добавлено:
    Думаю опубликовать один алгоритм, создал случайно.
     
    Задача: есть буфер в памяти, по размеру может занимать большую часть физической памяти, заполняется данными от начала и до конца, затем начинает заполнять сначала, затирая старые данные. В определённый момент заполнение останавливается. Получается, что последние данные - не в конце буфера, а самые старые - не в начале. Надо проскролить буфер, чтобы это исправить.  
     
    Классический приём - это выделение временного буфера, размер которого не превышает половины рабочего буфера с данными, сделать 2 memcpy() и 1 memmove(). Либо через файловую систему (запись, чтение). Но эти 2 вариант не годятся, ибо затратные либо по памяти, либо - времени.
     
    Сделал алгоритм по принципу пятнашек. Он с оптимизацией по памяти (не по скорости, разумеется). Изымаем 1 байт, остальные - переставляем, кладём изъятый байт на место. Работает без выделения буфера (буфером является регистр процессора, размером в 1 байт). В процессе алгоритма возможна (но не всегда, как-то связано с теорией простых чисел) оптимизация перемещения блоками (можно выделить пару килобайт в стеке).

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 12:19 26-05-2022 | Исправлено: nick7inc, 14:45 26-05-2022
    Rock

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc

    Цитата:
    Правильно ли я понимаю, что между блоками, где пропадает видимость массива buf[] память не возвращается стеку (в общем, это ухищрение бесполезно с точки зрения возврата памяти), а возврат будет по факту только при выходе из функции test()?
     


    Цитата:
    Я смотрел за регистром ESP и SS, вообще в ассемблере не сильно шарю, но по значению ESP получалось выделение в той же области, если строчки идентичные, и в новой области, если во втором случае размер отличается.

    Здесь, скорее всего, лучше знать не ассемблер, а что такое стек приложения -- Вам обязательно нужно посмотреть на его структуру в Интернете. Это самая простая структура в программировании. Выделение/освобождение в этом стеке -- это просто запись нового адреса в ESP. То есть, фактически бесплатно. Но есть одно, или даже два НО. В системах с виртуальной памятью (а вот эта концепция гораздо сложнее стека) операционная система может и однозначно будет выделять и, скорее всего освобождать, особенно при нехватке памяти, физические страницы памяти под стек по мере их использования. Причем, выделение физической страницы под стек -- это очень дорогая процедура. Вы завели очередную переменную в стеке, ESP передвинулся, но физической памяти в этом месте адресного пространства нет, Вы записываете туда что-то важное, возникает исключение ошибки памяти, которое перехватывает ОС, видит, что пишется в разрешенную область, под которую просто не подсунута реальная память, берет свободную физическую страницу (кстати, в подавляющем большинстве ОС это 4Кб, как и Ваши массивы), подсовывает ее в адресное пространства стека, куда было обращение, и возвращает управление Вашей программе для переповтора операции записи. Всем этим можно в какой-то степени управлять ключами компоновщика. Но люди чаще из практических соображений заменяют память в стеке на память из кучи -- стек гораздо быстрее кончается.
    Еще однозначно в плане производительности пострадает процессорный кэш.
    TLDR в самом общем случае, если не экономить стек, программа будет работать медленнее. В некоторых сценариях сильно медленнее.

    Всего записей: 1256 | Зарегистр. 10-04-2003 | Отправлено: 13:12 26-05-2022
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc

    Цитата:
    Думаю опубликовать один алгоритм, создал случайно.
    публикуй, чё...
     
    только сначала должна быть проблема/поставлена задача, а уже потом выдано её решение. абстрактно висящий алгоритм -- что сферический конь...
    но, по-видимому, задача у тебя есть...

    Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 14:41 26-05-2022 | Исправлено: akaGM, 14:42 26-05-2022
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Rock
    Интересно, буду знать (особенно про кэш ЦПУ).

    Цитата:
    стек гораздо быстрее кончается

    Да, в моём случае - это порядка 2х мегабайт. Я там храню мало и недолго. Если долго, то в куче, а в стеке - небольшие автоматические объекты, которые выделяют память (или иные ресурсы) в куче  в конструкторе, высвобождают - в деструкторе (чтобы избежать утечек).
     
     
    Добавлено:
    akaGM

    Цитата:
    задача у тебя есть...

    Угу, для прибора писал программу (данные с него сыпятся).  
    P.S. Чуть попозже выложу.


    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 14:43 26-05-2022 | Исправлено: nick7inc, 14:52 26-05-2022
    Rock

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc

    Цитата:
    Да, в моём случае - это порядка 2х мегабайт.

    На Винде размер стека потока (обратите на это внимание) по умолчанию 1 мегабайт. Расширяется указанием STACKSIZE компоновщику. Уточните, как подобные объемы переваривает Ваша система.

    Всего записей: 1256 | Зарегистр. 10-04-2003 | Отправлено: 14:59 26-05-2022
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привожу код скроллинга буффера, о котором говорил ранее.
    Грубо говоря, из "world!Hello, " делает "Hello, world!", но предназначен для данных больших объёмов, скроллинг делает методом перестановок (пятнашки, или как я в коде называю "карусель").
    Код

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 14:08 27-05-2022 | Исправлено: nick7inc, 14:13 27-05-2022
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc

    Цитата:
    Грубо говоря, из "world!Hello, " делает "Hello, world!"
    а можно ещё грубее :) задачу описать, ну, например, конкретно свою?

    Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 16:49 27-05-2022
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    Вроде описал.

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 17:03 27-05-2022
    zzz528

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    На понимаю в чём проблема, происходит развал сборки лисы 56 при добавлении файлов в layers\d3d9 от лисы 54.
    https://hg.mozilla.org/releases/mozilla-release/file/66ffd1657af82efff8e86f8b8a57f66d6d09fc02/gfx/layers/wr/WebRenderUserData.cpp
    ругаеться что всё undefined

    Код:
     
    class ImageClient;
    class ImageContainer;
    class WebRenderBridgeChild;
    class WebRenderImageData;
    class WebRenderFallbackData;
    class WebRenderLayerManager;
     

    https://hg.mozilla.org/releases/mozilla-release/file/66ffd1657af82efff8e86f8b8a57f66d6d09fc02/gfx/layers/wr/WebRenderUserData.h
     

    Всего записей: 1654 | Зарегистр. 20-06-2005 | Отправлено: 18:32 28-05-2022
    V0lt



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вопрос по шаблонному методу.
     
    Есть код.

    Код:
    class ByteReader
    {
        const uint8_t* m_start = nullptr;
        const uint8_t* m_end   = nullptr;
        const uint8_t* m_pos   = nullptr;
     
        bool m_error = false;
     
    public:
        ByteReader(const uint8_t* data, const size_t size)  
            : m_start(data)
            , m_pos(data)
            , m_end(data + size)
        {
            assert(m_start && size);
        }
     
        template<typename T>
        T Read()
        {
            if (m_pos + sizeof(T) <= m_end) {
                T value = *(T*)m_pos;
                m_pos += sizeof(T);
                return value;
            } else {
                m_pos = m_end;
                m_error = true;
                return 0;
            }
        }
    };

     
    Могу ли я как нибудь определить методы ReadUInt16(), ReadUInt32() и др. от шаблона T Read() ?
     
    VS2019 v16.11.15, C++17.

    Всего записей: 10506 | Зарегистр. 05-02-2003 | Отправлено: 17:24 01-06-2022
    Rock

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V0lt

    Цитата:
    Могу ли я как нибудь определить методы ReadUInt16(), ReadUInt32() и др. от шаблона T Read() ?

    Да. Гуглите partial specialization of member template.

    Всего записей: 1256 | Зарегистр. 10-04-2003 | Отправлено: 12:12 02-06-2022
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый вечер.
    Безопасно ли проверять размер буффера при помощи sizeof(), подсунув ему указатель, полученный от malloc()/realloc()/calloc()?
     

    Код:
    char * buffer =(char*) malloc(10);
    // ...
    const size_t size = sizeof(buffer );
    if (size<req_size) buffer =(char*) realloc(buffer ,req_size)

     
    P.S. Ерунда какая-то, не работает этот пример у меня должным образом:

    Код:
     char*buffer =(char*) malloc(11);
     printf("Size=%d\n",sizeof(buffer));

    Выводит 4 (так и должно быть), хотя по-идее из примера (сбили меня) ниже должен 11.
     
    Наткнулся на такой способ в в исходниках (походу ошибка copy-paste) Allegro5:

    Код:
    buffer = al_realloc(buffer, sizeof(buffer) + bytestoread);

    Походу он неправильный. Там, похоже, ко всему ещё и утечка памяти (дважды выделяется память под AL_VOC_DATA в voc_open() и _al_load_voc_f(), в последнем адрес первого буфера затирается, т.е. теряется тем, что возвращает первый).

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 21:35 07-06-2022 | Исправлено: nick7inc, 22:34 07-06-2022
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc

    Цитата:
    Безопасно ли проверять размер буффера при помощи sizeof(), подсунув ему указатель, полученный от malloc()/realloc()/calloc()?

    Безопасно. Только размер объекта в таком случае он не покажет, покажет размер указателя. Потому как оператор sizeof отрабатывает на этапе компиляции, а не в ходе работы программы.

    Цитата:
    Там, похоже, ко всему ещё и утечка памяти (дважды выделяется память под AL_VOC_DATA в voc_open() и _al_load_voc_f(), в последнем адрес первого буфера затирается, т.е. теряется тем, что возвращает первый).

    Нету тут утечки. Читайте описание realloc().

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 23:03 07-06-2022
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62

    Цитата:
    Нету тут утечки.

    Вы не туда смотрите. Смотрите на указатель vocdata:
    Код:
     
    ALLEGRO_SAMPLE *_al_load_voc_f(ALLEGRO_FILE *file)
    {
    AL_VOC_DATA *vocdata;
    ...
    vocdata = al_malloc(sizeof(AL_VOC_DATA));
    memset(vocdata, 0, sizeof(*vocdata));
    vocdata = voc_open(file);
    ...
     voc_close(vocdata);
    ...
    }

    Указатель затирается возвратом функции voc_open(), где тоже выделяется память под AL_VOC_DATA:

    Код:
    static AL_VOC_DATA *voc_open(ALLEGRO_FILE *fp)
    {
    AL_VOC_DATA *vocdata;
    ...
    vocdata = al_malloc(sizeof(AL_VOC_DATA));
    memset(vocdata, 0, sizeof(*vocdata));
    ...
     return vocdata;
    }
     
     
    А освобождается 1 раз в voc_close().

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 23:43 07-06-2022 | Исправлено: nick7inc, 23:53 07-06-2022
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Открыл у них issue.
     
    Добавлено:
    Abs62

    Цитата:
    Потому как оператор sizeof отрабатывает на этапе компиляции

    Спасибо, постараюсь запомнить.

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 12:35 08-06-2022
    HelioSS



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть ли ресурсы с кодом по обходу/заполнению всех известных капч?

    Всего записей: 5789 | Зарегистр. 26-11-2007 | Отправлено: 16:34 20-08-2022
    bomzz

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    HelioSS
    вряд ли иначе бы сменили все каптчи

    Всего записей: 3412 | Зарегистр. 29-03-2016 | Отправлено: 08:58 21-08-2022
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru