|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
скажите кто знает , вот разбираясь с перегрузкой оператора new[] для классов, у меня появилось недопонимание. при перегрузке new[] параметр в new sz (тип size_t) он равен всегда количество байт занимаемыми данными массива + 4байта. где 4 байта это ячейки содержащие длину массива. скажем делаю вот так : myClss* hhX3 = new myClss[2]; в этих четырех байта будет записана двойка. и располагаются эти 4 байта до байт содержащие данные массива таким образом массив получается в памяти размещается как 4 байта + байты данных массива. но это как-то не сочетается ведь с пониманием адресной арифметики . скажем я если сделаю int* x = new int[1]; (будем считать int псевдоклассом) а затем это x переведу в unsigned char* так : (unsigned char*)x и начну отнимать -1, -2, -3 (что по себе не очень хорошо, конечно) , то я ведь не выйду ни на какие 4 байта с длиной массива ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 21:36 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
скажем вот тут я перегрузил new[] (и просто new) для своего класса. память отвожу в обычном статичном массиве store. и черт побери там то я вижу эти длины в store . Код: 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. 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 21:45 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81 (unsigned char*)x и начну отнимать -1, -2, -3 (что по себе не очень хорошо, конечно) , то я ведь не выйду ни на какие 4 байта с длиной массива ??? Если в вашем менеджере динамической памяти размер массива действительно располагается в четырёх байтах перед самим массивом, то выйдете, конечно, на размер массива. Что ж не выйти то, если он там есть быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 21:46 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81 скажем вот тут я перегрузил new[] (и просто new) для своего класса. память отвожу в обычном статичном массиве store. и черт побери там то я вижу эти длины в store . А если вы реализуете свой механизм размещения массивов и видите там размер массива, то вы сами туда его и записываете. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 21:51 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81 -1, -2, -3 Итого: минус 6. Если ты три раза делал по минуc 1, то итого: МИНУС ТРИ. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 21:55 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81 а где находится длина массива ??? Нигде ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 22:08 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81он равен всегда количество байт занимаемыми данными массива + 4байта. Нет, не всегда. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Вывод: new[](8) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 22:10 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
ъъъъъ andron81 -1, -2, -3 Итого: минус 6. Если ты три раза делал по минуc 1, то итого: МИНУС ТРИ. да, ты прав. Но вот 4 раза , по дилетантски накидал : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
видишь тут длину ? я не очень 5 253 253 253 253 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 22:10 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andron81он равен всегда количество байт занимаемыми данными массива + 4байта. Нет, не всегда. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Вывод: new[](8) может это только в случае классов рисуется сначала 4 байта слева отвечающих за размер массива ? инт можно, конечно воспринимать как класс , но все же может это не для элементарных типов. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 22:16 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81может это только в случае классов рисуется сначала 4 байта слева отвечающих за размер массива ? В случае классов размер инстанса увеличивается на указатель на VMT если она есть и на выравнивание мемберов (а также самой структуры). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 22:20 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81 Dimitry Sibiryakov пропущено... Нет, не всегда. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Вывод: new[](8) может это только в случае классов рисуется сначала 4 байта слева отвечающих за размер массива ? инт можно, конечно воспринимать как класс , но все же может это не для элементарных типов. Нет разницы между базовыми типами и классами. Тебя Сибиряков просто обманул таким кодом. И дальше запутывает всякими VMT и выравниваниями. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 22:26 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81 может это только в случае классов рисуется сначала 4 байта слева отвечающих за размер массива ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 22:33 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81, используй не сырые массивы, а array<> или vector<> там все есть и это надежнее ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 22:48 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
petrav andron81 пропущено... может это только в случае классов рисуется сначала 4 байта слева отвечающих за размер массива ? инт можно, конечно воспринимать как класс , но все же может это не для элементарных типов. Нет разницы между базовыми типами и классами. Тебя Сибиряков просто обманул таким кодом. И дальше запутывает всякими VMT и выравниваниями. базовые пытался вычитать единички. на размер выйти не удалось )))) для примера с перегрузкой размер хранится в хранилище store . получается, что возвращатель return у new [] какой-то умный . он возвращает указатель не на начало всей цепочки байт (ведь цепочка начинается с размера), а с первого элемента. или я не знаю как объяснить. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 23:34 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81 petrav пропущено... Нет разницы между базовыми типами и классами. Тебя Сибиряков просто обманул таким кодом. И дальше запутывает всякими VMT и выравниваниями. базовые пытался вычитать единички. на размер выйти не удалось )))) для примера с перегрузкой размер хранится в хранилище store . получается, что возвращатель return у new [] какой-то умный . он возвращает указатель не на начало всей цепочки байт (ведь цепочка начинается с размера), а с первого элемента. или я не знаю как объяснить. Ну вот как тебе пояснить… Представим, что это мы с тобой разрабатываем управление динамической памятью. Допустим мы разработчики компилятора MinGW. Если мы выделяем массив байт размером N*sizeof(MyStruct), то нам нужно сохранить размер памяти, что бы освободить этот блок памяти. Мы можем размер памяти разместить перед результатом оператора new []. А можем разместить в другом месте. То что тебе не удалось выйти на размер — это ничего не значит. Оператор new [] тебе всегда возвращает указатель на первый элемент массива. А то что перед этим указателем может быть записан размер массива или не записан — это не известно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2021, 23:53 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
petrav andron81 пропущено... базовые пытался вычитать единички. на размер выйти не удалось )))) для примера с перегрузкой размер хранится в хранилище store . получается, что возвращатель return у new [] какой-то умный . он возвращает указатель не на начало всей цепочки байт (ведь цепочка начинается с размера), а с первого элемента. или я не знаю как объяснить. Ну вот как тебе пояснить… Представим, что это мы с тобой разрабатываем управление динамической памятью. Допустим мы разработчики компилятора MinGW. Если мы выделяем массив байт размером N*sizeof(MyStruct), то нам нужно сохранить размер памяти, что бы освободить этот блок памяти. Мы можем размер памяти разместить перед результатом оператора new []. А можем разместить в другом месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 00:16 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
a guest petrav пропущено... Ну вот как тебе пояснить… Представим, что это мы с тобой разрабатываем управление динамической памятью. Допустим мы разработчики компилятора MinGW. Если мы выделяем массив байт размером N*sizeof(MyStruct), то нам нужно сохранить размер памяти, что бы освободить этот блок памяти. Мы можем размер памяти разместить перед результатом оператора new []. А можем разместить в другом месте. Я пока писал предыдущий пост думал об это нюансе. Что хранить: число элементов массива или размер в байтах. Я просто выбрал самое простое решение: хранится размер в байтах. Это, конечно, очень сложная тема. Не готов рассуждать, а ТС-у это не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 00:29 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81цепочка начинается с размера Где ты подчерпнул такую идею? Так уже лет 20 никто не делает. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 00:32 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
petrav a guest пропущено... Вопрос темы про число элементов массива, а не размер выделенного блока. Я пока писал предыдущий пост думал об это нюансе. Что хранить: число элементов массива или размер в байтах. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 00:44 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andron81цепочка начинается с размера Где ты подчерпнул такую идею? Так уже лет 20 никто не делает. ОП имеет в виду не размер, а число элементов массива. Что в MSVC ABI, что в Itanium C++ ABI при необходимости записывают число элементов массива в начало выделяемого блока. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 00:54 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
a guestЧто в MSVC ABI, что в Itanium C++ ABI при необходимости записывают число элементов массива в начало выделяемого блока. А ссылочку таки можно?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 01:05 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov a guestЧто в MSVC ABI, что в Itanium C++ ABI при необходимости записывают число элементов массива в начало выделяемого блока. А ссылочку таки можно?.. не знаю как насчет ссылки, но экспериментально можно увидеть как new[] пишет в начало количество элементов массива. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
самое смешное, что убрав деструктор количество в начало не пишет ))) короче чудеса. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 08:40 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
petrav Оператор new [] тебе всегда возвращает указатель на первый элемент массива. я ж говорю оператор new[] какой-то умный )))) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 08:45 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
andron81 самое смешное, что убрав деструктор количество в начало не пишет ))) короче чудеса. Кол-во элементов массива хранится чтобы можно было для каждого элемента вызвать деструктор при уничтожении массива. Если тип trivially-destructible то его деструктор не нужно вызывать при уничтожении. Поэтому кол-во элементов массива не требуется знать в рантайме - просто вся память массива высвобождается и все. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 09:19 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, да, логично ! спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 09:38 |
|
а где находится длина массива ???
|
|||
---|---|---|---|
#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?all=1&fid=57&tid=2017215]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 242ms |
total: | 386ms |
0 / 0 |