Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: а где находится длина массива ???  [new]
petrav
Member

Откуда:
Сообщений: 2944
a guest
petrav
пропущено...

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

Мне кажется тут всё равно что писать. Или в байтах, или количество элементов. Типы в массивах одинаковы, не полиморфны ни как.
5 май 21, 10:01    [22318635]     Ответить | Цитировать Сообщить модератору
 Re: а где находится длина массива ???  [new]
petrav
Member

Откуда:
Сообщений: 2944
andron81
Dimitry Sibiryakov

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

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


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

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

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

Впрочем, я давно это изучал.
5 май 21, 10:18    [22318640]     Ответить | Цитировать Сообщить модератору
 Re: а где находится длина массива ???  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
petrav
andron81
пропущено...


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

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

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

Впрочем, я давно это изучал.


я не вру.
#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
5 май 21, 10:35    [22318643]     Ответить | Цитировать Сообщить модератору
 Re: а где находится длина массива ???  [new]
Dima T
Member

Откуда:
Сообщений: 15795
andron81
...
в случае myCls* kk = new myCls[4];
вывод будет такой , в первых 4-х байтах количество индексов :
...

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

Нигде не прописано как конкретно должно храниться количество выделенных элементов, это отдано на усмотрение рантайма, который может эту инфу хранить как вместе с данными, так и отдельно.
Т.е. в общем случае нельзя узнать размер массива выделенного через new[].
5 май 21, 10:42    [22318648]     Ответить | Цитировать Сообщить модератору
 Re: а где находится длина массива ???  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
Dima T, один компилятор использовал . тот который в VS ))
5 май 21, 10:45    [22318650]     Ответить | Цитировать Сообщить модератору
 Re: а где находится длина массива ???  [new]
a guest
Member

Откуда:
Сообщений: 335
Dimitry Sibiryakov

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

А ссылочку таки можно?..
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#array-cookies
5 май 21, 11:59    [22318689]     Ответить | Цитировать Сообщить модератору
 Re: а где находится длина массива ???  [new]
Anatoly Moskovsky
Member

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

В C++ перегруженные операторы new/delete отвечают только за низкоуровневое выделение памяти (просто блоками байтов), а не за создание/удаление объектов. За создание объектов (конструктор/деструктор) и учет количества отвечает сам компилятор, и он ничего не знает про внутреннюю структуру выделенных блоков памяти и их размер в момент удаления. Поэтому он резервирует дополнительную память если нужно.
5 май 21, 15:16    [22318836]     Ответить | Цитировать Сообщить модератору
 Re: а где находится длина массива ???  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

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

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

Posted via ActualForum NNTP Server 1.5

5 май 21, 15:21    [22318842]     Ответить | Цитировать Сообщить модератору
 Re: а где находится длина массива ???  [new]
petrav
Member

Откуда:
Сообщений: 2944
Dimitry Sibiryakov

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

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

А вам зачем понадобился такой функционал? Просто интересно.
5 май 21, 15:30    [22318850]     Ответить | Цитировать Сообщить модератору
 Re: а где находится длина массива ???  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

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

Я перегружаю оператор new, например, когда мне нужна структура переменной длины. Массивов
таких структур, конечно, не бывает, поэтому именно на эти грабли я не наступлю.
Есть ещё случай, когда структуре требуется определённое выравнивание в памяти.

Posted via ActualForum NNTP Server 1.5

5 май 21, 15:39    [22318860]     Ответить | Цитировать Сообщить модератору
 Re: а где находится длина массива ???  [new]
Dima T
Member

Откуда:
Сообщений: 15795
petrav
Dimitry Sibiryakov

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

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

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

Например выровнять под кэшлинию.
5 май 21, 17:11    [22318902]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / C++ Ответить