Гость
Форумы / C++ [игнор отключен] [закрыт для гостей] / Аллокация в конструктора массива / 25 сообщений из 61, страница 1 из 3
23.10.2021, 16:14
    #40106319
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
Здравствуйте - вопрос такой

Есть класс

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
class Pointer {
    uint64_t array[];

public:
    explicit Pointer(int capacity) {
    }


};




Как мне в конструкторе выделить память в размере capacity для массива array ? (Массив нужен именно на стеке)
...
Рейтинг: 0 / 0
23.10.2021, 16:21
    #40106321
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
indigodye0,

А зачем??? Чтобы деструктор не писать?

Возьми какой-нибудь стандартный контейнер (vector например) вместо примитивного массива и сможешь задать ему размер в конструкторе класса, а деструктор контейнера отработает автоматически когда элемент твоего класса "лежащий на стеке" умрет.
...
Рейтинг: 0 / 0
23.10.2021, 16:22
    #40106323
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
White Owl
indigodye0,

А зачем??? Чтобы деструктор не писать?

Возьми какой-нибудь стандартный контейнер (vector например) вместо примитивного массива и сможешь задать ему размер в конструкторе класса, а деструктор контейнера отработает автоматически когда элемент твоего класса "лежащий на стеке" умрет.



Вопрос позвольяет ли так сделать С++ ?
...
Рейтинг: 0 / 0
23.10.2021, 16:24
    #40106324
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
Самое простое - перековать в темплейт. Тогда получится ещё один std::array.
Чуть посложнее - использовать calloc().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.10.2021, 16:24
    #40106325
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
Dimitry Sibiryakov

Чуть посложнее - использовать calloc().


А как это будет выглядеть ?
...
Рейтинг: 0 / 0
23.10.2021, 16:25
    #40106327
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
indigodye0
White Owl
indigodye0,

А зачем??? Чтобы деструктор не писать?

Возьми какой-нибудь стандартный контейнер (vector например) вместо примитивного массива и сможешь задать ему размер в конструкторе класса, а деструктор контейнера отработает автоматически когда элемент твоего класса "лежащий на стеке" умрет.



Вопрос позвольяет ли так сделать С++ ?
Как? Так как я написал? Да позволяет.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class Pointer {
    std::vector<uint64_t> array;

public:
    explicit Pointer(int capacity) {
        array.reserve(capacity);
    }
};

И все.
...
Рейтинг: 0 / 0
23.10.2021, 16:30
    #40106329
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
White Owl
indigodye0
пропущено...



Вопрос позвольяет ли так сделать С++ ?
Как? Так как я написал? Да позволяет.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class Pointer {
    std::vector<uint64_t> array;

public:
    explicit Pointer(int capacity) {
        array.reserve(capacity);
    }
};

И все.


Нет не все

Это ответ на какой то другой вопрос
...
Рейтинг: 0 / 0
23.10.2021, 16:40
    #40106330
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
Самый главный вопрос тут

А сколько вообще памяти будет выделено в приведенном выше коде ?
...
Рейтинг: 0 / 0
23.10.2021, 16:57
    #40106332
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
indigodye0
Самый главный вопрос тут

А сколько вообще памяти будет выделено в приведенном выше коде ?
sizeof(Pointer)+sizeof(uint64_t)*capacity;
sizeof(Pointer) будет лежать на стеке а sizeof(uint64_t)*capacity ляжет там куда конструктор vector ее положит. На малых размерах оно может и на стеке лежать, на больших в кучу пойдет. Зависит от имплементации.

Что тебе конкретно нужно то?
...
Рейтинг: 0 / 0
23.10.2021, 16:58
    #40106333
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
White Owl
indigodye0
Самый главный вопрос тут

А сколько вообще памяти будет выделено в приведенном выше коде ?
sizeof(Pointer)+sizeof(uint64_t)*capacity;
sizeof(Pointer) будет лежать на стеке а sizeof(uint64_t)*capacity ляжет там куда конструктор vector ее положит. На малых размерах оно может и на стеке лежать, на больших в кучу пойдет. Зависит от имплементации.

Что тебе конкретно нужно то?



Не в векторе а в моем исходном коде

uint64_t array[];


Сколько тут выделится памяти ?

Нисколько ? А в чем тогда смысл такого объявления ?
...
Рейтинг: 0 / 0
23.10.2021, 17:08
    #40106335
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
---На малых размерах оно может и на стеке лежать


А как мне без внешних коллекций все на стек положить

Вектор то это как то делает
...
Рейтинг: 0 / 0
23.10.2021, 17:11
    #40106336
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
indigodye0

Не в векторе а в моем исходном коде

uint64_t array[];


Сколько тут выделится памяти ?

Нисколько ? А в чем тогда смысл такого объявления ?
Выделиться скорее всего sizeof(void*)

Смысл? Ну скорее всего это может быть "напоминанием" для человека что данный член класса это массив. И его надо объявлять/уничтожать через new[]/delete[]. Практически ничем не отличается в работе от указателя.

Еще это может быть попыткой повторить прием с простого С. Там так можно делать массивы переменной длины внутри структур.
Код: plaintext
1.
2.
3.
4.
5.
   struct A (
     int x;
     int arr[];
   }
   struct A *a = malloc(sizeof(struct A)+ sizeof(int)*capacity);

Но для С++ класса это работать не будет.
...
Рейтинг: 0 / 0
23.10.2021, 17:14
    #40106339
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
White Owl

uint64_t array[];


White Owl

И его надо объявлять/уничтожать через new[]/delete[]]


uint64_t array[]; как поле внутри С++ класса можно объявлять/уничтожать через new[]/delete[]] ?
...
Рейтинг: 0 / 0
23.10.2021, 17:29
    #40106342
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
indigodye0
---На малых размерах оно может и на стеке лежать


А как мне без внешних коллекций все на стек положить

Вектор то это как то делает
Что такое внешняя коллекция?

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


Выделять на стеке или в куче можно примерно так:
Код: 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.
#define MAX_ON_STACK 16
template<T>
class vector {
  int size;
  int capacity;
  bool useArrS;
  union {
      T arrS[MAX_ON_STACK];
      T *arr;
  }
  vector(int capacity) {
    useArrS = true;
    resize(capacity);    
  }

  void resize(int newCapacity) {
     if(capacity <= MAX_ON_STACK && useArrS) return;
     useArrS = false;
     T arrNew = new[newCapacity];
     copy(arr, arrNew, min(newCapacity, size));
     delete []arr;
     arr = newArr;
  }
  const T& at(int pos) {
    if (useArrS)
       return arrS[pos]; 
    else 
      return arr[pos];
  }
};
...
Рейтинг: 0 / 0
23.10.2021, 17:33
    #40106345
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
indigodye0А как это будет выглядеть ?

Вызов функции в языке программирования всегда выглядит как вызов функции. Что
тебе неясно после прочтения описания этой функции?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.10.2021, 17:57
    #40106349
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
Код: plaintext
1.
2.
3.
    uint64_t array[];

    array = calloc()



Работать не будет вроде ?
...
Рейтинг: 0 / 0
23.10.2021, 18:00
    #40106350
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
Используй std::array, он на стэке создается.
...
Рейтинг: 0 / 0
23.10.2021, 18:00
    #40106351
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
Dima T
Используй std::array, он на стэке создается.


Он щаблонный
...
Рейтинг: 0 / 0
23.10.2021, 18:16
    #40106353
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
В конструкторе выделить память на стеке? Теоретически конечно можно, но зачем? Все, что выделено на стеке, будет освобождено в момент завершения функции - в данном случае в момент завершения конструктора...
...
Рейтинг: 0 / 0
23.10.2021, 18:17
    #40106354
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
Barlone
В конструкторе выделить память на стеке? Теоретически конечно можно, но зачем? Все, что выделено на стеке, будет освобождено в момент завершения функции - в данном случае в момент завершения конструктора...


Нет

uint64_t array[];

Будет жить и после завершения конструктора
...
Рейтинг: 0 / 0
23.10.2021, 18:22
    #40106355
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
В данном случае всё, что тебе нужно, это
Код: sql
1.
uint64_t array[n];


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.10.2021, 18:23
    #40106356
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
Dimitry Sibiryakov

В данном случае всё, что тебе нужно, это
Код: sql
1.
uint64_t array[n];




И как в качестве n передать capacity из параметра конструктора ?
...
Рейтинг: 0 / 0
23.10.2021, 18:28
    #40106357
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
indigodye0И как в качестве n передать capacity из параметра конструктора ?

Выкинуть конструктор. Вместе с классом. Просто написать эту строчку там, где
тебе нужен массив в стеке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.10.2021, 18:29
    #40106358
indigodye0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
Dimitry Sibiryakov

indigodye0И как в качестве n передать capacity из параметра конструктора ?

Выкинуть конструктор. Вместе с классом. Просто написать эту строчку там, где
тебе нужен массив в стеке.



Ну короче в конструкоре никак.

ясно
...
Рейтинг: 0 / 0
23.10.2021, 18:33
    #40106359
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аллокация в конструктора массива
indigodye0Ну короче в конструкоре никак.

Да, для неспособных прочесть документацию - никак. Увы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Аллокация в конструктора массива / 25 сообщений из 61, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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