Гость
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / а где находится длина массива ??? / 25 сообщений из 36, страница 1 из 2
04.05.2021, 21:36
    #40068425
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
скажите кто знает , вот разбираясь с перегрузкой оператора 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 байта
с длиной массива ???
...
Рейтинг: 0 / 0
04.05.2021, 21:45
    #40068427
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
скажем вот тут я перегрузил 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.
//: C13:GlobalOperatorNew.cpp
#include <cstdio>
#include <cstdlib>
#include <iostream>

const int ElementCount = 100;

unsigned char  store[1002550];

bool  busyStore[ElementCount] = { false };
unsigned char  storeArr[2550];
bool  busyStoreArr[10000] = { false };

class myClss {
    int x;
    /*int y;
    int z;*/
    static int Next;
public:
    myClss() : x(555+Next++){ std::cout << "constr" << std::endl; };
    myClss(int x1) : x(x1){}
    ~myClss() {}
    void* operator new (size_t sz) {
        //std::cout << "here" << std::endl;
        int coord_not_busy = 0;
        for (; busyStore[coord_not_busy]; coord_not_busy++);
        busyStore[coord_not_busy] = true;
        return store + coord_not_busy * sizeof(myClss);
    }

    void operator delete (void* o) {
        unsigned long X = (unsigned long)o - (unsigned long)store;
        busyStore[((unsigned long)o - (unsigned long)store) / sizeof(x)] = false;
        //store+ X = 0;
    }

    void* operator new[](const size_t qty)  {
        int coord_not_busy = 0;
        int byteqtystringFree = 0;
        int x = 0;
        while (x < ElementCount) {
            for (; busyStore[coord_not_busy]; coord_not_busy++); //найдем первый незанятый элемент
            for (x = coord_not_busy, byteqtystringFree = 1; !busyStore[x] && byteqtystringFree < qty; x++, byteqtystringFree++);
            if (!busyStore[x] && byteqtystringFree == qty)

                return store + coord_not_busy  * sizeof(myClss);
            else coord_not_busy = x;
        }
        return 0;
    }

    void printValue() { std::cout << x << std::endl; }


};
int myClss::Next = 0;
int main() {
    myClss* hhX1 = new myClss(111);
    myClss* hhX2 = new myClss(222);
   
    myClss* hhX3 = new myClss[2];
    hhX1->printValue();
    hhX2->printValue();
    hhX3[0].printValue();
    hhX3[1].printValue();
}
...
Рейтинг: 0 / 0
04.05.2021, 21:46
    #40068428
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
andron81

(unsigned char*)x и начну отнимать -1, -2, -3 (что по себе не очень хорошо, конечно) , то я ведь не выйду ни на какие 4 байта
с длиной массива ???

Если в вашем менеджере динамической памяти размер массива действительно располагается в четырёх байтах перед самим массивом, то выйдете, конечно, на размер массива. Что ж не выйти то, если он там есть быть?
...
Рейтинг: 0 / 0
04.05.2021, 21:51
    #40068429
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
andron81
скажем вот тут я перегрузил new[] (и просто new) для своего класса. память отвожу в обычном статичном массиве store.
и черт побери там то я вижу эти длины в store .

А если вы реализуете свой механизм размещения массивов и видите там размер массива, то вы сами туда его и записываете.
...
Рейтинг: 0 / 0
04.05.2021, 21:55
    #40068430
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
andron81
-1, -2, -3

Итого: минус 6.
Если ты три раза делал по минуc 1, то итого: МИНУС ТРИ.
...
Рейтинг: 0 / 0
04.05.2021, 22:08
    #40068434
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
andron81
а где находится длина массива ???

Нигде
...
Рейтинг: 0 / 0
04.05.2021, 22:10
    #40068436
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
andron81он равен всегда количество байт занимаемыми данными массива + 4байта.

Нет, не всегда.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <stdio.h>

void* operator new[](size_t count)
{
   printf("new[](%u)\n", count);
   return (void*)12345;
}

int main()
{
   int* arr = new int[2];
}


Вывод: new[](8)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.05.2021, 22:10
    #40068437
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
ъъъъъ
andron81
-1, -2, -3

Итого: минус 6.
Если ты три раза делал по минуc 1, то итого: МИНУС ТРИ.


да, ты прав. Но вот 4 раза , по дилетантски накидал :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int* x = new int[1];
x[0] = 5;
unsigned char* xc = (unsigned char*)x;
std::cout << (int)*(xc) << std::endl;
std::cout<<(int)*(xc - 1)<<std::endl;
std::cout << (int)*(xc - 2) << std::endl;
std::cout << (int)*(xc - 3) << std::endl;
std::cout << (int)*(xc - 4) << std::endl;



видишь тут длину ? я не очень

5
253
253
253
253
...
Рейтинг: 0 / 0
04.05.2021, 22:16
    #40068438
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
Dimitry Sibiryakov

andron81он равен всегда количество байт занимаемыми данными массива + 4байта.

Нет, не всегда.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <stdio.h>

void* operator new[](size_t count)
{
   printf("new[](%u)\n", count);
   return (void*)12345;
}

int main()
{
   int* arr = new int[2];
}


Вывод: new[](8)


может это только в случае классов рисуется сначала 4 байта слева отвечающих за размер массива ? инт можно, конечно воспринимать как класс , но все же может это не для элементарных типов.
...
Рейтинг: 0 / 0
04.05.2021, 22:20
    #40068439
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
andron81может это только в случае классов рисуется сначала 4 байта слева отвечающих за размер
массива ?

В случае классов размер инстанса увеличивается на указатель на VMT если она есть и на
выравнивание мемберов (а также самой структуры).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.05.2021, 22:26
    #40068442
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
andron81
Dimitry Sibiryakov

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

Нет, не всегда.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <stdio.h>

void* operator new[](size_t count)
{
   printf("new[](%u)\n", count);
   return (void*)12345;
}

int main()
{
   int* arr = new int[2];
}


Вывод: new[](8)


может это только в случае классов рисуется сначала 4 байта слева отвечающих за размер массива ? инт можно, конечно воспринимать как класс , но все же может это не для элементарных типов.

Нет разницы между базовыми типами и классами. Тебя Сибиряков просто обманул таким кодом. И дальше запутывает всякими VMT и выравниваниями.
...
Рейтинг: 0 / 0
04.05.2021, 22:33
    #40068444
a guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
andron81
может это только в случае классов рисуется сначала 4 байта слева отвечающих за размер массива ?
Зависит от ABI. Для скалярных типов нет смысла хранить число элементов массива. Для классов с достаточно тривиальными деструкторами тоже.
...
Рейтинг: 0 / 0
04.05.2021, 22:48
    #40068449
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
andron81,

используй не сырые массивы, а array<> или vector<>

там все есть и это надежнее
...
Рейтинг: 0 / 0
04.05.2021, 23:34
    #40068455
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
petrav
andron81
пропущено...


может это только в случае классов рисуется сначала 4 байта слева отвечающих за размер массива ? инт можно, конечно воспринимать как класс , но все же может это не для элементарных типов.

Нет разницы между базовыми типами и классами. Тебя Сибиряков просто обманул таким кодом. И дальше запутывает всякими VMT и выравниваниями.


базовые пытался вычитать единички. на размер выйти не удалось )))) для примера с перегрузкой размер хранится в хранилище store . получается, что возвращатель return у new [] какой-то умный . он возвращает указатель не на начало всей цепочки байт (ведь цепочка начинается с размера), а с первого элемента. или я не знаю как объяснить.
...
Рейтинг: 0 / 0
04.05.2021, 23:53
    #40068457
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
andron81
petrav
пропущено...

Нет разницы между базовыми типами и классами. Тебя Сибиряков просто обманул таким кодом. И дальше запутывает всякими VMT и выравниваниями.


базовые пытался вычитать единички. на размер выйти не удалось )))) для примера с перегрузкой размер хранится в хранилище store . получается, что возвращатель return у new [] какой-то умный . он возвращает указатель не на начало всей цепочки байт (ведь цепочка начинается с размера), а с первого элемента. или я не знаю как объяснить.

Ну вот как тебе пояснить…

Представим, что это мы с тобой разрабатываем управление динамической памятью. Допустим мы разработчики компилятора MinGW. Если мы выделяем массив байт размером N*sizeof(MyStruct), то нам нужно сохранить размер памяти, что бы освободить этот блок памяти. Мы можем размер памяти разместить перед результатом оператора new []. А можем разместить в другом месте.

То что тебе не удалось выйти на размер — это ничего не значит.

Оператор new [] тебе всегда возвращает указатель на первый элемент массива. А то что перед этим указателем может быть записан размер массива или не записан — это не известно.
...
Рейтинг: 0 / 0
05.05.2021, 00:16
    #40068462
a guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
petrav
andron81
пропущено...


базовые пытался вычитать единички. на размер выйти не удалось )))) для примера с перегрузкой размер хранится в хранилище store . получается, что возвращатель return у new [] какой-то умный . он возвращает указатель не на начало всей цепочки байт (ведь цепочка начинается с размера), а с первого элемента. или я не знаю как объяснить.

Ну вот как тебе пояснить…

Представим, что это мы с тобой разрабатываем управление динамической памятью. Допустим мы разработчики компилятора MinGW. Если мы выделяем массив байт размером N*sizeof(MyStruct), то нам нужно сохранить размер памяти, что бы освободить этот блок памяти. Мы можем размер памяти разместить перед результатом оператора new []. А можем разместить в другом месте.
Вопрос темы про число элементов массива, а не размер выделенного блока.
...
Рейтинг: 0 / 0
05.05.2021, 00:29
    #40068465
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
a guest
petrav
пропущено...

Ну вот как тебе пояснить…

Представим, что это мы с тобой разрабатываем управление динамической памятью. Допустим мы разработчики компилятора MinGW. Если мы выделяем массив байт размером N*sizeof(MyStruct), то нам нужно сохранить размер памяти, что бы освободить этот блок памяти. Мы можем размер памяти разместить перед результатом оператора new []. А можем разместить в другом месте.
Вопрос темы про число элементов массива, а не размер выделенного блока.

Я пока писал предыдущий пост думал об это нюансе. Что хранить: число элементов массива или размер в байтах. Я просто выбрал самое простое решение: хранится размер в байтах. Это, конечно, очень сложная тема. Не готов рассуждать, а ТС-у это не нужно.
...
Рейтинг: 0 / 0
05.05.2021, 00:32
    #40068466
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
andron81цепочка начинается с размера

Где ты подчерпнул такую идею? Так уже лет 20 никто не делает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.05.2021, 00:44
    #40068467
a guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
petrav
a guest
пропущено...
Вопрос темы про число элементов массива, а не размер выделенного блока.

Я пока писал предыдущий пост думал об это нюансе. Что хранить: число элементов массива или размер в байтах.
А почему «или»? И то, и другое может быть нужно разным ... подсистемам.
...
Рейтинг: 0 / 0
05.05.2021, 00:54
    #40068469
a guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
Dimitry Sibiryakov

andron81цепочка начинается с размера

Где ты подчерпнул такую идею? Так уже лет 20 никто не делает.
ОП имеет в виду не размер, а число элементов массива. Что в MSVC ABI, что в Itanium C++ ABI при необходимости записывают число элементов массива в начало выделяемого блока.
...
Рейтинг: 0 / 0
05.05.2021, 01:05
    #40068472
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
a guestЧто в MSVC ABI, что в Itanium C++ ABI при необходимости записывают число элементов массива
в начало выделяемого блока.

А ссылочку таки можно?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.05.2021, 08:40
    #40068482
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
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.
#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;
    
}



самое смешное, что убрав деструктор количество в начало не пишет ))) короче чудеса.
...
Рейтинг: 0 / 0
05.05.2021, 08:45
    #40068483
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
petrav

Оператор new [] тебе всегда возвращает указатель на первый элемент массива.


я ж говорю оператор new[] какой-то умный ))))
...
Рейтинг: 0 / 0
05.05.2021, 09:19
    #40068490
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
andron81
самое смешное, что убрав деструктор количество в начало не пишет ))) короче чудеса.

Кол-во элементов массива хранится чтобы можно было для каждого элемента вызвать деструктор при уничтожении массива.
Если тип trivially-destructible то его деструктор не нужно вызывать при уничтожении. Поэтому кол-во элементов массива не требуется знать в рантайме - просто вся память массива высвобождается и все.
...
Рейтинг: 0 / 0
05.05.2021, 09:38
    #40068494
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а где находится длина массива ???
Anatoly Moskovsky,

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


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