|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
a guest petrav пропущено... Я пока писал предыдущий пост думал об это нюансе. Что хранить: число элементов массива или размер в байтах. Мне кажется тут всё равно что писать. Или в байтах, или количество элементов. Типы в массивах одинаковы, не полиморфны ни как. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 10:01 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81 Dimitry Sibiryakov пропущено... А ссылочку таки можно?.. не знаю как насчет ссылки, но экспериментально можно увидеть как new[] пишет в начало количество элементов массива. самое смешное, что убрав деструктор количество в начало не пишет ))) короче чудеса. Вообще это странно, что у вас пишется количество элементов. Если вы сами выделяете память в некоем storage, то вы по идее и ответственны за удаление объектов. И сами должны где-то сохранять количество элементов. Впрочем, я давно это изучал. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 10:18 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
petrav andron81 пропущено... не знаю как насчет ссылки, но экспериментально можно увидеть как new[] пишет в начало количество элементов массива. самое смешное, что убрав деструктор количество в начало не пишет ))) короче чудеса. Вообще это странно, что у вас пишется количество элементов. Если вы сами выделяете память в некоем storage, то вы по идее и ответственны за удаление объектов. И сами должны где-то сохранять количество элементов. Впрочем, я давно это изучал. я не вру. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
в случае myCls* kk = new myCls[4]; вывод будет такой , в первых 4-х байтах количество индексов : storage[0]=4 storage[1]=0 storage[2]=0 storage[3]=0 storage[4]=1 storage[5]=0 storage[6]=0 storage[7]=0 storage[8]=2 storage[9]=0 storage[10]=0 storage[11]=0 storage[12]=3 storage[13]=0 storage[14]=0 storage[15]=0 storage[16]=4 storage[17]=0 storage[18]=0 storage[19]=0 storage[20]=0 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 10:35 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81 ... в случае myCls* kk = new myCls[4]; вывод будет такой , в первых 4-х байтах количество индексов : ... Сколько компиляторов использовал для проверки данного утверждения? Нигде не прописано как конкретно должно храниться количество выделенных элементов, это отдано на усмотрение рантайма, который может эту инфу хранить как вместе с данными, так и отдельно. Т.е. в общем случае нельзя узнать размер массива выделенного через new[]. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 10:42 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
Dima T, один компилятор использовал . тот который в VS )) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 10:45 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov a guestЧто в MSVC ABI, что в Itanium C++ ABI при необходимости записывают число элементов массива в начало выделяемого блока. А ссылочку таки можно?.. https://itanium-cxx-abi.github.io/cxx-abi/abi.html#array-cookies ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 11:59 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
petrav Вообще это странно, что у вас пишется количество элементов. Если вы сами выделяете память в некоем storage, то вы по идее и ответственны за удаление объектов. И сами должны где-то сохранять количество элементов. В C++ перегруженные операторы new/delete отвечают только за низкоуровневое выделение памяти (просто блоками байтов), а не за создание/удаление объектов. За создание объектов (конструктор/деструктор) и учет количества отвечает сам компилятор, и он ничего не знает про внутреннюю структуру выделенных блоков памяти и их размер в момент удаления. Поэтому он резервирует дополнительную память если нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 15:16 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyПоэтому он резервирует дополнительную память если нужно. Отсюда вытекает забавная подколка когда переменная получает из new не тот адрес, который вернул перегруженный оператор new. Надо будет пошерстить свой код на эти грабли... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 15:21 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Anatoly MoskovskyПоэтому он резервирует дополнительную память если нужно. Отсюда вытекает забавная подколка когда переменная получает из new не тот адрес, который вернул перегруженный оператор new. Надо будет пошерстить свой код на эти грабли... А вам зачем понадобился такой функционал? Просто интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 15:30 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
petravА вам зачем понадобился такой функционал? Я перегружаю оператор new, например, когда мне нужна структура переменной длины. Массивов таких структур, конечно, не бывает, поэтому именно на эти грабли я не наступлю. Есть ещё случай, когда структуре требуется определённое выравнивание в памяти. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 15:39 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
petrav Dimitry Sibiryakov пропущено... Отсюда вытекает забавная подколка когда переменная получает из new не тот адрес, который вернул перегруженный оператор new. Надо будет пошерстить свой код на эти грабли... А вам зачем понадобился такой функционал? Просто интересно. Например выровнять под кэшлинию. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 17:11 |
|
|
Start [/forum/topic.php?fid=57&msg=40068540&tid=2017215]: |
0ms |
get settings: |
25ms |
get forum list: |
24ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
274ms |
get tp. blocked users: |
2ms |
others: | 310ms |
total: | 693ms |
0 / 0 |