Динамический размер массива С++

Тема в разделе "WASM.BEGINNERS", создана пользователем Enchantner, 31 окт 2008.

  1. Enchantner

    Enchantner New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    23
    Есть класс, в который через конструктор передается количество элементов массива и длина элемента (строки) в байтах. Задачка: получить массив указателей для использования их в качестве индексов - номеров строк в массиве - и обращаться по ним отдельно к каждой строке. Проблема в том, что длина строки в массиве должна задаваться пользователем, как и количество элементов. Как в таком случае собрать указатели? И как вернуть их в main()?

    Пробовал создать класс строки, размер которой задается пользователем при создании - пока не преуспел. Знаю, что вопрос нубский, но хочется понять.
     
  2. airyashov

    airyashov New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2008
    Сообщения:
    12
    char** mas=new char*[N];
    for (i=0;i<N;i++){
    mas=new char[lensrt];
    mas='\0';
    }
     
  3. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785

    1. раз на С++ всё, то нафика нам char*? юзайте std::string
    2. ежели хочется юзать char*, то выделять надо на 1 символ больше под завершающий '\0'.
    3. освободить потом не забыть память, угу:)
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А если это не конструктор, а функция, нуждающаяся в небольшом локальном буфере, заранее неизвестного размера, можно как нибудь обойтись без громоздких в реализации new/delete ?
    Хочу чтобы:
    Код (Text):
    1. void myFunc (...; int N)
    2. {
    3.     int mas[N];
    4.     for (int i=0; i<N; ++i)
    5.     { ... mas[i]... }   // что-то делаем с элементами массива
    6.     ...
    7. }
    компилировалось во что-то типа:
    Код (Text):
    1.     mov ecx, [N]
    2.     shl ecx, 2
    3.     sub esp, ecx
    4.     xor esi, esi
    5.     @@:
    6.         ... [esi*4 + esp] ... ; обращение к элементам массива в цикле по esi
    7.     add  esi, 1
    8.     cmp esi, [N]
    9.     jl @B
    10.     add esp, ecx
    ато от new/delete больно уж много совершенно бестолковых накладых расходов.
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Y_Mur == Enchanter ?:)

    выше я понял то, что массивы все эти создаются единожды. если так, то о чем переживать? если не так, то поясните зачем при кажд вызове ф-ции myFunc создавать какие-то буферы?
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    varnie
    нет равенство не верно ;)), просто увидел подходящий заголовок и решил тут же спросить про похожую задачу, отличающуюся тем, что массив временный и локальный для текущей функции. А то С++ в лоб int mas[N]; признавать не желает.
    дак ведь если вместо N константа, то такие массивы создаются в стеке на ура через esp - размер, а почему тоже самое динамически запрещено непонятно :) вроде это не дельфи, которая всё потенциально опасные конструкции категорически запрещает :)
     
  7. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Y_Mur
    В С99 такое есть.
    Как вариант _alloca/std::vector/boost::array/etc.
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    censored
    сенькс, действительно вектор реализован неожиданно дзенно :))
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Y_Mur
    да ну, ты ему льстишь.
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Booster
    по сравнению с new (матрёшка с кучей уровней вложенности, и массой тяжёлых и явно бесполезных действий) просто супердзенно :)))
     
  11. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    писАть на С++ и пользоваться Сишными массивами завместо векторов итд -- нехорошо:)
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    varnie
    А я-то наивный полагал, что чем древнее конструкция языка, тем большее количество версий компилятора она оттачивалась и совершенствовалась :))) а оказывается наоборот :)))
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    varnie
    Неправда. Стек очень быстр.

    new не причём, он то как раз создаёт динамический массив.
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Booster
    я полагал что под new скрывается нечто вроде HeapAlloc, которую при самостоятельно реализации можно существенно упростить по сравнению с api-шной, а там такаааая матрёшка ведущая к rtlHeapAlloc и попутно дополнительно делающая какой то бред (vs2005).

    да ты прав vector фиксированного размера, это почти то что я хотел в #4, а вот растущий (push_back) вектор уже гораздо хуже, но впрочем это уже следующая задача - как на С++ дзенно сделать "резиновый массив" не прибегая к api, хотя это тоже интересно.
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Y_Mur
    Ты главное для стльного, фиксированно массива юзай reserve.
     
  16. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Ё-моё, чем вам new-то не угодил?
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Booster
    в смысле basic_string::reserve ???

    SadKo
    просто взгляни на него в дизасме и сравни с командой sub esp, sizeBuffer (см #4) :))
    для конструктора, вызываемого один раз, new конечно пойдёт за третий сорт, а для локального временного массива это явный перебор (хотя речь конечно же не о new как элементе языка, а о его реализации в vc2005).
     
  18. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    HeapAlloc() кстати весьма быстр в RELEASE-е. Я однажды сделал свой аллокатор и замерил результаты. Проиграл HeapAlloc()-у где-то процентов 20. И мой код даже не имел мульти-тредной способности. Только после внимательного рассматривания выяснилось что надо убрать один if() с критического пути. Только тогда удалось побить HeapAlloc().
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Y_Mur
    Со строкой это врятли имеет большой смысл. Это больше подходит для вектора.
     
  20. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    ну ёлки, напиши свой inline operator new для массива, который вызывает alloca, и будет тебе счастье.