powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Аллокация в конструктора массива
25 сообщений из 61, страница 2 из 3
Аллокация в конструктора массива
    #40106362
indigodye0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

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

Да, для неспособных прочесть документацию - никак. Увы.


Ну ты же способен прочесть документацию и для тебе тоже похоже никак
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106363
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня нет задачи где такое необходимо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106364
indigodye0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

У меня нет задачи где такое необходимо.


Да Брось ты

Ты просто не знаешь ответа на мой вопрос
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106365
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
indigodye0

Нет

uint64_t array[];

Будет жить и после завершения конструктора
В стандарте так нельзя. Даже если ваш компилятор такое позволяет в качестве расширения, вы должны каким-то образом сначала выделить память, а потом вызвать конструктор для инициализации с помощью placement new
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106368
indigodye0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Barlone
indigodye0

Нет

uint64_t array[];

Будет жить и после завершения конструктора
В стандарте так нельзя. Даже если ваш компилятор такое позволяет в качестве расширения, вы должны каким-то образом сначала выделить память, а потом вызвать конструктор для инициализации с помощью placement new


http://cpp.sh/8by5js
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106375
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
indigodye0
Вопрос позвольяет ли так сделать С++ ?

Можно.
Но пользоваться это памятью ты сможешь лишь в самом конструкторе...
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106378
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
indigodye0Ты просто не знаешь ответа на мой вопрос

Ну...

Использовать шаблоны ты не хочешь.
Использовать calloc ты не хочешь.
Использовать простой массив массив ты не хочешь.

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

Использовать calloc ты не хочешь.


Ты так и не раскрыл как ты это себе представляешь
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106381
indigodye0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
https://en.cppreference.com/w/c/memory/calloc

Calloc выделяет память в куче и вовращает указатель

У нас же вообще то на стеке все
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106386
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
indigodye0Ты так и не раскрыл как ты это себе представляешь

А, да. Во-первых, я перепутал calloc и alloca. Во-вторых, не учёл, что оно
освободится при завершении текущей процедуры, то есть конструктора.

Значит у тебя остаются всего две возможности: шаблоны и простой массив
переменной длины.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106387
indigodye0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Значит у тебя остаются всего две возможности: шаблоны и простой массив
переменной длины.


Все пропало
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106389
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
indigodye0
Dimitry Sibiryakov

Значит у тебя остаются всего две возможности: шаблоны и простой массив
переменной длины.


Все пропало

Ты, наверное, знаешь какой-то хитрый трюк, но проверяешь, не знает ли его кто-то ещё?
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106390
indigodye0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ
indigodye0
пропущено...


Все пропало

Ты, наверное, знаешь какой-то хитрый трюк, но проверяешь, не знает ли его кто-то ещё?


Нет, просто я был тут недавно на интервью и меня там будущий тим лид спрашивал - как такое сделать

Я сказал что так нельзя

Он уверенно гнал что можно
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106395
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
indigodye0
ъъъъъ
пропущено...

Ты, наверное, знаешь какой-то хитрый трюк, но проверяешь, не знает ли его кто-то ещё?


Нет, просто я был тут недавно на интервью и меня там будущий тим лид спрашивал - как такое сделать

Я сказал что так нельзя

Он уверенно гнал что можно

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


Нет, просто я был тут недавно на интервью и меня там будущий тим лид спрашивал - как такое сделать

Я сказал что так нельзя

Он уверенно гнал что можно

Можно, но, как уже обсудили, локально, лишь в пределах функции.
...
А ты не выпытал из него, что он имел в виду? А то может, что-то типа "объект на стеке, а в объекте ссылка на блок в куче".


Ну не надо думать что я такой идиот и не в курсе про шаблоны alloca и другие "умные" советы

Вопрос звучал равно как я его сюда привел
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106397
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
indigodye0

Как мне в конструкторе выделить память в размере capacity для массива array ? (Массив нужен именно на стеке)

Можно в декларации поля сразу хапнуть много () памяти на стеке, а потом, "динамически", делать её логически доступной, в размере не большем, чем было хапнуто.
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106416
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
indigodye0
Barlone
пропущено...
В стандарте так нельзя. Даже если ваш компилятор такое позволяет в качестве расширения, вы должны каким-то образом сначала выделить память, а потом вызвать конструктор для инициализации с помощью placement new


http://cpp.sh/8by5js
Я же говорю - в стандарте нельзя
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106571
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
indigodye0, ответ на твой вопрос дюже прост - компилятор должен знать размер типа на этапе компиляции, а массив переменной длины, длина которого задаётся из конструктора в рантайме, этого сделать не позволяет. Тебе остаётся лишь хранить указатель на массив в куче и его размер, управляя выделением памяти из кучи под массив в конструкторе/деструкторе.
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106575
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
indigodye0
https://en.cppreference.com/w/c/memory/calloc

Calloc выделяет память в куче и вовращает указатель

У нас же вообще то на стеке все
Тогда только шаблонный класс, где параметр шаблона - размер массива.
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106605
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
indigodye0
Здравствуйте - вопрос такой

Есть класс

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

public:
    explicit Pointer(int capacity) {
    }


};




Как мне в конструкторе выделить память в размере capacity для массива array ? (Массив нужен именно на стеке)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
class Pointer {
    uint64_t* m_pArray;

public:
    explicit inline Pointer(size_t capacity) : 
		m_pArray((uint64_t*)alloca(sizeof(m_pArray[0]) * capacity)) {
    }

	uint64_t& at(size_t n){ return m_pArray[n]; };
};

int main()
{
	uint64_t a = 777;
	Pointer p(2);
	uint64_t b = 888;

	p.at(0) = 0;
	p.at(1) = 111;

	return 0;
}
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106634
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я
Код: plaintext
1.
2.
3.
    explicit inline Pointer(size_t capacity) : 
		m_pArray((uint64_t*)alloca(sizeof(m_pArray[0]) * capacity)) {
    }


Формально это UB даже если к-тор заинлайнится, потому что при выходе из к-тора память выделенная через alloca "освободится", а значит компилятор может туда положить что угодно затирая данные.
То что в каких-то частных случая этого не происходит, делает все это еще сложнее для отладки.
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106673
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
при выходе из к-тора память выделенная через alloca "освободится"

Место на стеке освободится если бы alloca стоял внутри {}.
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106682
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я
Anatoly Moskovsky
при выходе из к-тора память выделенная через alloca "освободится"

Место на стеке освободится если бы alloca стоял внутри {}.

Да, действительно, неправ я, проверка:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	uint64_t a = 777;
	
	Pointer p(2);
	p.at(0) = 0;
	p.at(1) = 111;

	Pointer p2(2);
	p2.at(0) = 222;
	p2.at(1) = 333;

	uint64_t b = 888;


Объект p2 затирает данные объекта p.
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106749
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я, разве в стандарте C/C++ есть функции alloca/std::alloca ?
...
Рейтинг: 0 / 0
Аллокация в конструктора массива
    #40106803
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
ну я, разве в стандарте C/C++ есть функции alloca/std::alloca ?
В стандарте С alloca - есть.
В стандарте С++ std::alloca - нет.
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Аллокация в конструктора массива
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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