|
а где находится длина массива ???
|
|||
---|---|---|---|
#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 |
|
|
start [/forum/topic.php?desktop=1&fid=57&tid=2017215]: |
0ms |
get settings: |
25ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
492ms |
get tp. blocked users: |
2ms |
others: | 314ms |
total: | 918ms |
0 / 0 |