Есть класс, в который через конструктор передается количество элементов массива и длина элемента (строки) в байтах. Задачка: получить массив указателей для использования их в качестве индексов - номеров строк в массиве - и обращаться по ним отдельно к каждой строке. Проблема в том, что длина строки в массиве должна задаваться пользователем, как и количество элементов. Как в таком случае собрать указатели? И как вернуть их в main()? Пробовал создать класс строки, размер которой задается пользователем при создании - пока не преуспел. Знаю, что вопрос нубский, но хочется понять.
1. раз на С++ всё, то нафика нам char*? юзайте std::string 2. ежели хочется юзать char*, то выделять надо на 1 символ больше под завершающий '\0'. 3. освободить потом не забыть память, угу
А если это не конструктор, а функция, нуждающаяся в небольшом локальном буфере, заранее неизвестного размера, можно как нибудь обойтись без громоздких в реализации new/delete ? Хочу чтобы: Code (Text): void myFunc (...; int N) { int mas[N]; for (int i=0; i<N; ++i) { ... mas[i]... } // что-то делаем с элементами массива ... } компилировалось во что-то типа: Code (Text): mov ecx, [N] shl ecx, 2 sub esp, ecx xor esi, esi @@: ... [esi*4 + esp] ... ; обращение к элементам массива в цикле по esi add esi, 1 cmp esi, [N] jl @B add esp, ecx ато от new/delete больно уж много совершенно бестолковых накладых расходов.
Y_Mur == Enchanter ? выше я понял то, что массивы все эти создаются единожды. если так, то о чем переживать? если не так, то поясните зачем при кажд вызове ф-ции myFunc создавать какие-то буферы?
varnie нет равенство не верно ), просто увидел подходящий заголовок и решил тут же спросить про похожую задачу, отличающуюся тем, что массив временный и локальный для текущей функции. А то С++ в лоб int mas[N]; признавать не желает. дак ведь если вместо N константа, то такие массивы создаются в стеке на ура через esp - размер, а почему тоже самое динамически запрещено непонятно вроде это не дельфи, которая всё потенциально опасные конструкции категорически запрещает
Booster по сравнению с new (матрёшка с кучей уровней вложенности, и массой тяжёлых и явно бесполезных действий) просто супердзенно ))
varnie А я-то наивный полагал, что чем древнее конструкция языка, тем большее количество версий компилятора она оттачивалась и совершенствовалась )) а оказывается наоборот ))
Booster я полагал что под new скрывается нечто вроде HeapAlloc, которую при самостоятельно реализации можно существенно упростить по сравнению с api-шной, а там такаааая матрёшка ведущая к rtlHeapAlloc и попутно дополнительно делающая какой то бред (vs2005). да ты прав vector фиксированного размера, это почти то что я хотел в #4, а вот растущий (push_back) вектор уже гораздо хуже, но впрочем это уже следующая задача - как на С++ дзенно сделать "резиновый массив" не прибегая к api, хотя это тоже интересно.
Booster в смысле basic_string::reserve ??? SadKo просто взгляни на него в дизасме и сравни с командой sub esp, sizeBuffer (см #4) ) для конструктора, вызываемого один раз, new конечно пойдёт за третий сорт, а для локального временного массива это явный перебор (хотя речь конечно же не о new как элементе языка, а о его реализации в vc2005).
HeapAlloc() кстати весьма быстр в RELEASE-е. Я однажды сделал свой аллокатор и замерил результаты. Проиграл HeapAlloc()-у где-то процентов 20. И мой код даже не имел мульти-тредной способности. Только после внимательного рассматривания выяснилось что надо убрать один if() с критического пути. Только тогда удалось побить HeapAlloc().