powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / а где находится длина массива ???
25 сообщений из 36, страница 1 из 2
а где находится длина массива ???
    #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
а где находится длина массива ???
    #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
а где находится длина массива ???
    #40068428
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81

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

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

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

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

Нигде
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #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
а где находится длина массива ???
    #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
а где находится длина массива ???
    #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
а где находится длина массива ???
    #40068439
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81может это только в случае классов рисуется сначала 4 байта слева отвечающих за размер
массива ?

В случае классов размер инстанса увеличивается на указатель на VMT если она есть и на
выравнивание мемберов (а также самой структуры).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #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
а где находится длина массива ???
    #40068444
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andron81
может это только в случае классов рисуется сначала 4 байта слева отвечающих за размер массива ?
Зависит от ABI. Для скалярных типов нет смысла хранить число элементов массива. Для классов с достаточно тривиальными деструкторами тоже.
...
Рейтинг: 0 / 0
а где находится длина массива ???
    #40068449
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

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

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


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

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


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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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