|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Здравствуйте - вопрос такой Есть класс Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Как мне в конструкторе выделить память в размере capacity для массива array ? (Массив нужен именно на стеке) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 16:14 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0, А зачем??? Чтобы деструктор не писать? Возьми какой-нибудь стандартный контейнер (vector например) вместо примитивного массива и сможешь задать ему размер в конструкторе класса, а деструктор контейнера отработает автоматически когда элемент твоего класса "лежащий на стеке" умрет. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 16:21 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
White Owl indigodye0, А зачем??? Чтобы деструктор не писать? Возьми какой-нибудь стандартный контейнер (vector например) вместо примитивного массива и сможешь задать ему размер в конструкторе класса, а деструктор контейнера отработает автоматически когда элемент твоего класса "лежащий на стеке" умрет. Вопрос позвольяет ли так сделать С++ ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 16:22 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Самое простое - перековать в темплейт. Тогда получится ещё один std::array. Чуть посложнее - использовать calloc(). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 16:24 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Чуть посложнее - использовать calloc(). А как это будет выглядеть ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 16:24 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0 White Owl indigodye0, А зачем??? Чтобы деструктор не писать? Возьми какой-нибудь стандартный контейнер (vector например) вместо примитивного массива и сможешь задать ему размер в конструкторе класса, а деструктор контейнера отработает автоматически когда элемент твоего класса "лежащий на стеке" умрет. Вопрос позвольяет ли так сделать С++ ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
И все. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 16:25 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
White Owl indigodye0 пропущено... Вопрос позвольяет ли так сделать С++ ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
И все. Нет не все Это ответ на какой то другой вопрос ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 16:30 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Самый главный вопрос тут А сколько вообще памяти будет выделено в приведенном выше коде ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 16:40 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0 Самый главный вопрос тут А сколько вообще памяти будет выделено в приведенном выше коде ? sizeof(Pointer) будет лежать на стеке а sizeof(uint64_t)*capacity ляжет там куда конструктор vector ее положит. На малых размерах оно может и на стеке лежать, на больших в кучу пойдет. Зависит от имплементации. Что тебе конкретно нужно то? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 16:57 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
White Owl indigodye0 Самый главный вопрос тут А сколько вообще памяти будет выделено в приведенном выше коде ? sizeof(Pointer) будет лежать на стеке а sizeof(uint64_t)*capacity ляжет там куда конструктор vector ее положит. На малых размерах оно может и на стеке лежать, на больших в кучу пойдет. Зависит от имплементации. Что тебе конкретно нужно то? Не в векторе а в моем исходном коде uint64_t array[]; Сколько тут выделится памяти ? Нисколько ? А в чем тогда смысл такого объявления ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 16:58 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
---На малых размерах оно может и на стеке лежать А как мне без внешних коллекций все на стек положить Вектор то это как то делает ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 17:08 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0 Не в векторе а в моем исходном коде uint64_t array[]; Сколько тут выделится памяти ? Нисколько ? А в чем тогда смысл такого объявления ? Смысл? Ну скорее всего это может быть "напоминанием" для человека что данный член класса это массив. И его надо объявлять/уничтожать через new[]/delete[]. Практически ничем не отличается в работе от указателя. Еще это может быть попыткой повторить прием с простого С. Там так можно делать массивы переменной длины внутри структур. Код: plaintext 1. 2. 3. 4. 5.
Но для С++ класса это работать не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 17:11 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
White Owl uint64_t array[]; White Owl И его надо объявлять/уничтожать через new[]/delete[]] uint64_t array[]; как поле внутри С++ класса можно объявлять/уничтожать через new[]/delete[]] ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 17:14 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0 ---На малых размерах оно может и на стеке лежать А как мне без внешних коллекций все на стек положить Вектор то это как то делает Все на стек положить нельзя. Не в случае классов. Да и не нужно это практически никогда. Если тебе сильно хочется именно на стек - ты что-то делаешь не правильно. Выделять на стеке или в куче можно примерно так: Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 17:29 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0А как это будет выглядеть ? Вызов функции в языке программирования всегда выглядит как вызов функции. Что тебе неясно после прочтения описания этой функции? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 17:33 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3.
Работать не будет вроде ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 17:57 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Используй std::array, он на стэке создается. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 18:00 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Dima T Используй std::array, он на стэке создается. Он щаблонный ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 18:00 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
В конструкторе выделить память на стеке? Теоретически конечно можно, но зачем? Все, что выделено на стеке, будет освобождено в момент завершения функции - в данном случае в момент завершения конструктора... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 18:16 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Barlone В конструкторе выделить память на стеке? Теоретически конечно можно, но зачем? Все, что выделено на стеке, будет освобождено в момент завершения функции - в данном случае в момент завершения конструктора... Нет uint64_t array[]; Будет жить и после завершения конструктора ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 18:17 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
В данном случае всё, что тебе нужно, это Код: sql 1.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 18:22 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov В данном случае всё, что тебе нужно, это Код: sql 1.
И как в качестве n передать capacity из параметра конструктора ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 18:23 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0И как в качестве n передать capacity из параметра конструктора ? Выкинуть конструктор. Вместе с классом. Просто написать эту строчку там, где тебе нужен массив в стеке. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 18:28 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov indigodye0И как в качестве n передать capacity из параметра конструктора ? Выкинуть конструктор. Вместе с классом. Просто написать эту строчку там, где тебе нужен массив в стеке. Ну короче в конструкоре никак. ясно ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 18:29 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0Ну короче в конструкоре никак. Да, для неспособных прочесть документацию - никак. Увы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 18:33 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov indigodye0Ну короче в конструкоре никак. Да, для неспособных прочесть документацию - никак. Увы. Ну ты же способен прочесть документацию и для тебе тоже похоже никак ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 18:36 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
У меня нет задачи где такое необходимо. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 18:38 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov У меня нет задачи где такое необходимо. Да Брось ты Ты просто не знаешь ответа на мой вопрос ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 18:39 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0 Нет uint64_t array[]; Будет жить и после завершения конструктора ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 19:02 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Barlone indigodye0 Нет uint64_t array[]; Будет жить и после завершения конструктора http://cpp.sh/8by5js ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 19:35 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0 Вопрос позвольяет ли так сделать С++ ? Можно. Но пользоваться это памятью ты сможешь лишь в самом конструкторе... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 20:44 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0Ты просто не знаешь ответа на мой вопрос Ну... Использовать шаблоны ты не хочешь. Использовать calloc ты не хочешь. Использовать простой массив массив ты не хочешь. Извини, но на твой вопрос ответов больше нет. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 21:23 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Использовать calloc ты не хочешь. Ты так и не раскрыл как ты это себе представляешь ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 21:25 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
https://en.cppreference.com/w/c/memory/calloc Calloc выделяет память в куче и вовращает указатель У нас же вообще то на стеке все ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 21:26 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0Ты так и не раскрыл как ты это себе представляешь А, да. Во-первых, я перепутал calloc и alloca. Во-вторых, не учёл, что оно освободится при завершении текущей процедуры, то есть конструктора. Значит у тебя остаются всего две возможности: шаблоны и простой массив переменной длины. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 22:17 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Значит у тебя остаются всего две возможности: шаблоны и простой массив переменной длины. Все пропало ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 22:20 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0 Dimitry Sibiryakov Значит у тебя остаются всего две возможности: шаблоны и простой массив переменной длины. Все пропало Ты, наверное, знаешь какой-то хитрый трюк, но проверяешь, не знает ли его кто-то ещё? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 22:23 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
ъъъъъ indigodye0 пропущено... Все пропало Ты, наверное, знаешь какой-то хитрый трюк, но проверяешь, не знает ли его кто-то ещё? Нет, просто я был тут недавно на интервью и меня там будущий тим лид спрашивал - как такое сделать Я сказал что так нельзя Он уверенно гнал что можно ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 22:25 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0 ъъъъъ пропущено... Ты, наверное, знаешь какой-то хитрый трюк, но проверяешь, не знает ли его кто-то ещё? Нет, просто я был тут недавно на интервью и меня там будущий тим лид спрашивал - как такое сделать Я сказал что так нельзя Он уверенно гнал что можно Можно, но, как уже обсудили, локально, лишь в пределах функции. ... А ты не выпытал из него, что он имел в виду? А то может, что-то типа "объект на стеке, а в объекте ссылка на блок в куче". ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 23:05 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
ъъъъъ indigodye0 пропущено... Нет, просто я был тут недавно на интервью и меня там будущий тим лид спрашивал - как такое сделать Я сказал что так нельзя Он уверенно гнал что можно Можно, но, как уже обсудили, локально, лишь в пределах функции. ... А ты не выпытал из него, что он имел в виду? А то может, что-то типа "объект на стеке, а в объекте ссылка на блок в куче". Ну не надо думать что я такой идиот и не в курсе про шаблоны alloca и другие "умные" советы Вопрос звучал равно как я его сюда привел ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 23:07 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0 Как мне в конструкторе выделить память в размере capacity для массива array ? (Массив нужен именно на стеке) Можно в декларации поля сразу хапнуть много () памяти на стеке, а потом, "динамически", делать её логически доступной, в размере не большем, чем было хапнуто. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2021, 23:13 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0 Barlone пропущено... В стандарте так нельзя. Даже если ваш компилятор такое позволяет в качестве расширения, вы должны каким-то образом сначала выделить память, а потом вызвать конструктор для инициализации с помощью placement new http://cpp.sh/8by5js ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2021, 09:17 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0, ответ на твой вопрос дюже прост - компилятор должен знать размер типа на этапе компиляции, а массив переменной длины, длина которого задаётся из конструктора в рантайме, этого сделать не позволяет. Тебе остаётся лишь хранить указатель на массив в куче и его размер, управляя выделением памяти из кучи под массив в конструкторе/деструкторе. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 11:58 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0 https://en.cppreference.com/w/c/memory/calloc Calloc выделяет память в куче и вовращает указатель У нас же вообще то на стеке все ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 12:06 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0 Здравствуйте - вопрос такой Есть класс Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Как мне в конструкторе выделить память в размере capacity для массива array ? (Массив нужен именно на стеке) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 12:35 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
ну я Код: plaintext 1. 2. 3.
Формально это UB даже если к-тор заинлайнится, потому что при выходе из к-тора память выделенная через alloca "освободится", а значит компилятор может туда положить что угодно затирая данные. То что в каких-то частных случая этого не происходит, делает все это еще сложнее для отладки. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 13:23 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky при выходе из к-тора память выделенная через alloca "освободится" Место на стеке освободится если бы alloca стоял внутри {}. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 14:42 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
ну я Anatoly Moskovsky при выходе из к-тора память выделенная через alloca "освободится" Место на стеке освободится если бы alloca стоял внутри {}. Да, действительно, неправ я, проверка: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Объект p2 затирает данные объекта p. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 14:50 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
ну я, разве в стандарте C/C++ есть функции alloca/std::alloca ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 16:21 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
rdb_dev ну я, разве в стандарте C/C++ есть функции alloca/std::alloca ? В стандарте С++ std::alloca - нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 18:03 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
ну я Место на стеке освободится если бы alloca стоял внутри {}. Инициализаторы выполняются в стек фрейме конструктора. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 18:05 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
White Owl В стандарте С alloca - есть. В стандарте С++ std::alloca - нет. В C тоже нет, и в POSIX тоже )) Но это не отменяет того факта что на многих платформах эта фича существует. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 18:11 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky White Owl В стандарте С alloca - есть. В стандарте С++ std::alloca - нет. В C тоже нет, и в POSIX тоже )) Но это не отменяет того факта что на многих платформах эта фича существует. man allocaCONFORMING TO This function is not in POSIX.1. There is evidence that the alloca() function appeared in 32V, PWB, PWB.2, 3BSD, and 4BSD. There is a man page for it in 4.3BSD. Linux uses the GNU version. Так что да, в стандарте нет, но в реальных библиотеках все-же есть. Во всяком случае во всех никсовых библиотеках есть. А мелкомягкие дают _alloca и _malloca. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 19:02 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
rdb_dev ну я, разве в стандарте C/C++ есть функции alloca/std::alloca ? Нет, в стандарте языка нет такого. http://www.c-cpp.ru/content/alloca Другое дело что это в компиляторах есть и трактуется одинаково. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2021, 22:35 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
White Owl, нет в стандарте ANSI C никакой alloca(). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 10:16 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
White Owl, "легально" такие вещи реализуются на стеке через placement new. Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2021, 11:26 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
indigodye0, может быть собеседующий действительно имел в виду alloca + placement new? Код: plaintext 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.
Но я бы не стал так делать, потому что alloca -- это хождение по тонкому льду :). ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2021, 02:27 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Пётр Седов [/src]Но я бы не стал так делать, потому что alloca -- это хождение по тонкому льду :). Ага то есть Вы ка бы вывернули класс мехом на изнанку и положили все на стек А что тут опасного ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2021, 11:43 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Зачем все усложнять? )) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2021, 15:16 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
priti40 А что тут опасного ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Компилятор Visual C++ 6, в Debug конфигурации всё было нормально. Но вот в Release конфигурации компилятор зачем-то inline-ил вызов функции another_func (хотя она была не такая уж и маленькая), и работало оно так, как будто код такой: Код: plaintext 1. 2. 3. 4. 5. 6.
В Win32 для stack-а главного thread-а по умолчанию резервируется диапазон в 1 мб виртуальных адресов. Вот весь этот мегабайт исчерпывался, и программа crash-илась со stack overflow. С тех пор я понял, что alloca -- это грабли, и перестал его использовать. Хотя современный Visual C++ может уже понимает, что не надо inline-ить вызов функции с alloca. В ATL есть старые макросы для преобразования строк, которые выделяют память через alloca. Потом вместо них сделали более надёжный механизм: http://msdn.microsoft.com/EN-US/library/87zae4a3(v=VS.120,d=hv.2).aspx ATL and MFC String Conversion Macros ... There are several important differences between the older string conversion macros and the new string conversion classes: Old ATL 3.0 Conversion Macros New ATL 7.0 Conversion Classes Allocates memory on the stack.Uses stack memory for small strings. Uses the heap if the stack is not large enough.The string is freed when the function is exited.The string is freed when the variable goes out of scope.Cannot be used in exception handlers.Can be used in exception handlers.Not suitable for use in loops. Memory use grows until the function is exited.Supports use in loops. Loop scope ensures that memory is freed on each iteration.Not good for large strings. Stack space is limited.No problems with large strings. Strings will be allocated on the heap.Usually require USES_CONVERSION to be defined.Never require USES_CONVERSION to be defined.Meaning of OLE depends on definition of OLE2ANSI.OLE is always equivalent to W.... ATL 3.0 String Conversion Macros ... The destination string is created using _alloca , except when the destination type is BSTR . Пункт про обработчики исключений сильно настораживает. Anatoly Moskovsky Код: plaintext 1. 2.
Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 03:02 |
|
Аллокация в конструктора массива
|
|||
---|---|---|---|
#18+
Пётр Седов А тут не будет проблем с выравниванием (alignment)? Нет. Гарантируется правильное выравнивание. Как и для любых других аллокаторов. https://en.cppreference.com/w/cpp/memory/memory_resource/allocate Хотя конечно если буфер сразу выровнен, то не будет потерян первый невыровненный кусок. Но это всего лишь оптимизация, а не необходимость. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 12:14 |
|
|
start [/forum/topic.php?all=1&fid=57&tid=2017160]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
53ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
82ms |
get tp. blocked users: |
1ms |
others: | 270ms |
total: | 452ms |
0 / 0 |