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 ответов

11 просмотров

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

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 Автор вопроса

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

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

Сообщение* в закодированном виде. То есть, просто сделать sendMessage?text=Привет бла-бла! не получится, надо в HEX переводить, и добавлять процент, типа такого: sendMessage?t...
КТ315
21
А случайно нет ли в паскале штатной возможности передать указатель и количество туда где array of в качестве аргумента?
zamtmn
25
Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
58
Всем привет. Испытываю проблемы в работе БД, а именно огромного роста логов, такого характера: 024-05-16 18:39:07 +05 sentry sentry [unknown] 1050169 7-1 app-sentry01.corp.ru>...
Alexey
2
Если подытожить: По мнению Розыча и Хемуля и др. - предпочтительно по возможности объявлять в секции имплементации потому-что: 1) Выше скорость компиляции 2) Не замусоривается...
notme
7
Хм. А телеграм апи работают через HTTP?
The Bird of Hermes
14
Ну раз я пока тут, задам пару глупых вопросов. Зачем писать на ассемблере если компилятор довольно умный, а ассемблер много времени занимает? В каких прикладных задачах сейчас...
Максим Рябцев
20
Почему Telegram пишет, что объект media не найден, хотя на самом деле я его передаю? Делаю на urllib, без зависимостей, так надо. Вызываю метод sendMediaGroup с таким JSON: ...
Alexey S
1
В дельфе нет никакого коробочного (без установки третьих либ) способа получить CallStack с расшифровкой отладочных символов?
notme
7
Приветики всем!)) Подскажите: есть функция, которая записывает число типа Cardinal в четыре байта, хранимые в TBytes. Можете помочь мне, показав, как должна выглядеть функци...
Моринаро
5
Карта сайта