powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / а где находится длина массива ???
11 сообщений из 36, страница 2 из 2
а где находится длина массива ???
    #40068499
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest
petrav
пропущено...

Я пока писал предыдущий пост думал об это нюансе. Что хранить: число элементов массива или размер в байтах.
А почему «или»? И то, и другое может быть нужно разным ... подсистемам.

Мне кажется тут всё равно что писать. Или в байтах, или количество элементов. Типы в массивах одинаковы, не полиморфны ни как.
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #40068503
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Dimitry Sibiryakov

пропущено...

А ссылочку таки можно?..


не знаю как насчет ссылки, но экспериментально можно увидеть как new[] пишет в начало количество элементов массива.

самое смешное, что убрав деструктор количество в начало не пишет ))) короче чудеса.

Вообще это странно, что у вас пишется количество элементов. Если вы сами выделяете память в некоем storage,
то вы по идее и ответственны за удаление объектов. И сами должны где-то сохранять количество элементов.

Впрочем, я давно это изучал.
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #40068505
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
#include <iostream>
unsigned char storage[50];
class myCls {
    int iii;
    static int Next;
public:
    myCls() : iii(Next++) {};
    ~myCls() {};
    void* operator new[](size_t sz) {

        return storage;
    }

};
int myCls::Next = 1;
int main()
{
    myCls* kk = new myCls[4];
    for (size_t i = 0; i < 50; i++)
        std::cout << "storage[" << i << "]=" << (int)storage[i] << std::endl;
}


в случае 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
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #40068508
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
...
в случае myCls* kk = new myCls[4];
вывод будет такой , в первых 4-х байтах количество индексов :
...

Сколько компиляторов использовал для проверки данного утверждения?

Нигде не прописано как конкретно должно храниться количество выделенных элементов, это отдано на усмотрение рантайма, который может эту инфу хранить как вместе с данными, так и отдельно.
Т.е. в общем случае нельзя узнать размер массива выделенного через new[].
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #40068510
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, один компилятор использовал . тот который в VS ))
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #40068540
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

a guestЧто в MSVC ABI, что в Itanium C++ ABI при необходимости записывают число элементов массива
в начало выделяемого блока.

А ссылочку таки можно?..
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#array-cookies
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #40068601
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Вообще это странно, что у вас пишется количество элементов. Если вы сами выделяете память в некоем storage,
то вы по идее и ответственны за удаление объектов. И сами должны где-то сохранять количество элементов.

В C++ перегруженные операторы new/delete отвечают только за низкоуровневое выделение памяти (просто блоками байтов), а не за создание/удаление объектов. За создание объектов (конструктор/деструктор) и учет количества отвечает сам компилятор, и он ничего не знает про внутреннюю структуру выделенных блоков памяти и их размер в момент удаления. Поэтому он резервирует дополнительную память если нужно.
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #40068606
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyПоэтому он резервирует дополнительную память если нужно.

Отсюда вытекает забавная подколка когда переменная получает из new не тот адрес, который
вернул перегруженный оператор new. Надо будет пошерстить свой код на эти грабли...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #40068611
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Anatoly MoskovskyПоэтому он резервирует дополнительную память если нужно.

Отсюда вытекает забавная подколка когда переменная получает из new не тот адрес, который
вернул перегруженный оператор new. Надо будет пошерстить свой код на эти грабли...

А вам зачем понадобился такой функционал? Просто интересно.
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #40068618
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravА вам зачем понадобился такой функционал?

Я перегружаю оператор new, например, когда мне нужна структура переменной длины. Массивов
таких структур, конечно, не бывает, поэтому именно на эти грабли я не наступлю.
Есть ещё случай, когда структуре требуется определённое выравнивание в памяти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #40068640
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Dimitry Sibiryakov

пропущено...

Отсюда вытекает забавная подколка когда переменная получает из new не тот адрес, который
вернул перегруженный оператор new. Надо будет пошерстить свой код на эти грабли...

А вам зачем понадобился такой функционал? Просто интересно.

Например выровнять под кэшлинию.
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / а где находится длина массива ???
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]