placement new?
#include <array>
#include <string>
#include <iostream>
int main () {
std::array<char, 10000> data;
new (data.data()) std::string("hello");
new (data.data() + sizeof(std::string)) std::string("world");
return 0;
}
А какие проблемы?
переживая, чтобы оптимизатор съел
Мне кажется тут делается совсем не то, что автор задумал. И тут нужен обычный strncpy
тогда будет инит объекта + копирование, нет?
Но вообще что-то странное происходит конечно
Есть конструктор без инита
ок, я пытаюсь зафиксировать размещение структуры в памяти. забиваю болт на padding. для это выделяю данных по размеру всех полей структуры, и дальше нужно их проинициализировать. мб есть другой подход к исходной проблеме с размещением?
Просто хочешь хранить структуры в одном куске памяти?
Болт на паддинг просто так забивать это УБ. Безопаснее это делать через прагму пак
хочу иметь возможность адресовать поле структуры, имея указатель на начало структуры и последовательность типов всех полей.
А типа итерирование по структуре так реализуешь?
а где уб возникает при подходе с размещением в массиве?
Адрессовать объект невыравненный неочень хорошо
но прагмы же нет в стандарте
В том, что у тебя два объекта с разным лайфтаймом расположены в одном участке памяти. Для таких хаков нужен лаундер
ну я их убиваю тоже руками
Но есть в компиляторах
но зачем?
хочу иметь возможность адресовать поле структуры, имея указатель на начало структуры и последовательность типов всех полей.
это не поможет вам в решении вашей задачи
что именно, в решение какой задачи?
а я не представляю, что вы пытаетесь сделать)
тогда откуда утверждение?
ну вы видимо хотите сделать структуру вручную инициализировав её поля (или вроде того)
А нельзя вместо последовательности типов всех полей использовать последовательность указателей на поля класса?
ок, а почему ручное размещение соверншенно точно не даст ничего подобного?
дорого. во время компиляции резолвить надо.
потому что вы будете обращаться к структуре, которую не создавали
что вы имеете ввиду?
Что резолвить?
адреса полей
я имею в виду, что наличие объекта типа S в памяти по адресу S* определяется фактом его создания
А что дорогого?
и? не вижу, по прежниму, противоречий
то есть, скажем struct A { int x; int y; }; struct B { int x; int y; }; int test(B* b) { return b->x; } int test(A* a) { return test(reinterpret_cast<B*>(a)); } //UB int main() { test(new A()); }
ну так я создаю объекты нужных типов на месте, стандартными средствами. посмотрите оригинальный вопрос.
Т.е. у тебя структура это просто массив байт куда объекты записаны?
ну вы сделали неправильный std::tuple, да
никакой структурой от этого он не стал
а чем он стал?
кем был, тем и остался
tuple гарантирует размещение в памяти?
в каком смысле гарантирует?
всмысле в данным в tuple выравнивание разве не применяется?
там будет достаточно необычная структура выравнивания, если вы об этом
ну тогда возвращается ко второму вопросу, получается не выйдет имея на руках указатель на структуру держащую tuple и список типов адресовать его члены
Список типов это что подразумевается?
последовательность типов известная на этапе компиляции
Так есть std::get. Какие проблемы
давайте так: откуда вообще взялся этот указатель?
Видимо человек свой magic_get пишет
последовательность типов имеет номер(в данной модели). приходит укзаатель на память + такой номер, с запросом - наполни.
Я честно уже запутался что ты хочешь и для чего
offsetof ещё нужны. Но они известны на этапе компиляции
почему бы мне не вернуть значение по-человечески из функции, зачем я его записываю в какое-то место памяти?
снизить связность библиотек
что мешает использовать структуры?
это повышает связность
Так в cpp ты же все равно конкретную структуру наполняешь и надо соответствующие заголовки подключать
нет, я генерирую код наполнения.
Обсуждают сегодня