170 похожих чатов

Для инициализации куска памяти данными нужных типов есть техники лучше

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;
}

64 ответов

22 просмотра

А какие проблемы?

Aleksei-Korolev Автор вопроса
Слава
А какие проблемы?

переживая, чтобы оптимизатор съел

Мне кажется тут делается совсем не то, что автор задумал. И тут нужен обычный strncpy

Aleksei-Korolev Автор вопроса
Stas
Мне кажется тут делается совсем не то, что автор з...

тогда будет инит объекта + копирование, нет?

Но вообще что-то странное происходит конечно

Aleksei-Korolev Автор вопроса
Слава
Но вообще что-то странное происходит конечно

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

Aleksei Korolev
ок, я пытаюсь зафиксировать размещение структуры в...

Просто хочешь хранить структуры в одном куске памяти?

Aleksei Korolev
ок, я пытаюсь зафиксировать размещение структуры в...

Болт на паддинг просто так забивать это УБ. Безопаснее это делать через прагму пак

Aleksei-Korolev Автор вопроса
Слава
Просто хочешь хранить структуры в одном куске памя...

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

Aleksei Korolev
хочу иметь возможность адресовать поле структуры, ...

А типа итерирование по структуре так реализуешь?

Aleksei-Korolev Автор вопроса
Stas
Болт на паддинг просто так забивать это УБ. Безопа...

а где уб возникает при подходе с размещением в массиве?

Aleksei Korolev
а где уб возникает при подходе с размещением в ма...

Адрессовать объект невыравненный неочень хорошо

Aleksei Korolev
а где уб возникает при подходе с размещением в ма...

В том, что у тебя два объекта с разным лайфтаймом расположены в одном участке памяти. Для таких хаков нужен лаундер

Aleksei-Korolev Автор вопроса

но зачем?

Aleksei-Korolev Автор вопроса
Constantine Drozdov
но зачем?

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

Aleksei-Korolev Автор вопроса
Aleksei Korolev
что именно, в решение какой задачи?

а я не представляю, что вы пытаетесь сделать)

Aleksei-Korolev Автор вопроса
Aleksei Korolev
тогда откуда утверждение?

ну вы видимо хотите сделать структуру вручную инициализировав её поля (или вроде того)

Aleksei Korolev
хочу иметь возможность адресовать поле структуры, ...

А нельзя вместо последовательности типов всех полей использовать последовательность указателей на поля класса?

Aleksei-Korolev Автор вопроса
Constantine Drozdov
ну вы видимо хотите сделать структуру вручную иниц...

ок, а почему ручное размещение соверншенно точно не даст ничего подобного?

Aleksei-Korolev Автор вопроса
Слава
А нельзя вместо последовательности типов всех поле...

дорого. во время компиляции резолвить надо.

Aleksei Korolev
ок, а почему ручное размещение соверншенно точно н...

потому что вы будете обращаться к структуре, которую не создавали

Aleksei-Korolev Автор вопроса
Aleksei Korolev
что вы имеете ввиду?

я имею в виду, что наличие объекта типа S в памяти по адресу S* определяется фактом его создания

Aleksei Korolev
адреса полей

А что дорогого?

Aleksei-Korolev Автор вопроса
Constantine Drozdov
я имею в виду, что наличие объекта типа 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()); }

Aleksei-Korolev Автор вопроса
Constantine Drozdov
то есть, скажем struct A { int x; int y; }; struct...

ну так я создаю объекты нужных типов на месте, стандартными средствами. посмотрите оригинальный вопрос.

Aleksei Korolev
ну так я создаю объекты нужных типов на месте, ста...

Т.е. у тебя структура это просто массив байт куда объекты записаны?

Constantine Drozdov
ну вы сделали неправильный std::tuple, да

никакой структурой от этого он не стал

Aleksei Korolev
а чем он стал?

кем был, тем и остался

Aleksei-Korolev Автор вопроса
Constantine Drozdov
ну вы сделали неправильный std::tuple, да

tuple гарантирует размещение в памяти?

Aleksei-Korolev Автор вопроса
Constantine Drozdov
в каком смысле гарантирует?

всмысле в данным в tuple выравнивание разве не применяется?

Aleksei Korolev
всмысле в данным в tuple выравнивание разве не при...

там будет достаточно необычная структура выравнивания, если вы об этом

Aleksei-Korolev Автор вопроса
Constantine Drozdov
там будет достаточно необычная структура выравнива...

ну тогда возвращается ко второму вопросу, получается не выйдет имея на руках указатель на структуру держащую tuple и список типов адресовать его члены

Aleksei-Korolev Автор вопроса
Слава
Список типов это что подразумевается?

последовательность типов известная на этапе компиляции

Aleksei Korolev
последовательность типов известная на этапе компил...

давайте так: откуда вообще взялся этот указатель?

Aleksei-Korolev Автор вопроса
Constantine Drozdov
давайте так: откуда вообще взялся этот указатель?

последовательность типов имеет номер(в данной модели). приходит укзаатель на память + такой номер, с запросом - наполни.

Aleksei Korolev
последовательность типов имеет номер(в данной моде...

Я честно уже запутался что ты хочешь и для чего

Aleksei Korolev
ну тогда возвращается ко второму вопросу, получает...

offsetof ещё нужны. Но они известны на этапе компиляции

Aleksei Korolev
последовательность типов имеет номер(в данной моде...

почему бы мне не вернуть значение по-человечески из функции, зачем я его записываю в какое-то место памяти?

Aleksei Korolev
снизить связность библиотек

что мешает использовать структуры?

Aleksei-Korolev Автор вопроса
Aleksei Korolev
снизить связность библиотек

Так в cpp ты же все равно конкретную структуру наполняешь и надо соответствующие заголовки подключать

Aleksei-Korolev Автор вопроса

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта