Форум программистов, компьютерный форум CyberForum.ru

Передача структуры данных между DLL-ками / DLL - EXE в байтовом виде, влияет ли выравнивание? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Буквенные величины http://www.cyberforum.ru/cpp-beginners/thread1304766.html
Помогите с задачами 1.Вводится с клавиатуры длина отрезка в сантиметрах / метрах например 52,12. Записать данное расстояние текстом Пятьдесят два сантиметра двадцать миллиметров. 2.З клавіатури вводиться текстовий рядок.Скласти програму ,яка виводить на екран всі символи ,які розташовані після першого символу <<:>>;підраховує кількість речень ,що має непарну кількість слів .
C++ Найти все вершины графа, недостижимые из данной вершины u Орграф G(V, E), состоящий из N вершин с номерами 1, 2, ..., N и M дуг, задан списком дуг. Необходимо найти все вершины графа, недостижимые из данной вершины u. #include<iostream> #include <fstream> #include<string> #include<sstream> using namespace std; ifstream in("input.txt"); ofstream out("output.txt"); class List http://www.cyberforum.ru/cpp-beginners/thread1304760.html
Дана последовательность из n вещественных чисел C++
Дана последовательность из n вещественных чисел. Если в результате замены отрицательных элементов последовательности их квадратами элементы будут образовывать неубывающую последовательность, то получить сумму элементов исходной последовательности, в противном случае получить их произведение. Помогите пожалуйста написать программу, буду благодарен.
Написать программу: вычисление функции в заданном интервале C++
Определить значение функции y = arcctg ( x ) / ( x ^ 2-5x + 6) на промежутке с шагом h = 0.4 Используя для вычисления значения функции подпрограму - функцию.
C++ Для заданных а,б,с вычислить выражение http://www.cyberforum.ru/cpp-beginners/thread1304747.html
Задачу и формулы надо переписывать! Редактор формул внизу страницы.
C++ Действие при определенном шаге цикла Подскажите пожалуйста, есть цикл for ( i=0; i<100 000; i++), нужно что бы при каждом значении i равному 10к, 20к, 30к, и тд. до 100 000 происходило действие например cout<<i; Спасибо. подробнее

Показать сообщение отдельно
-THE_MASTER666-
Заблокирован

Передача структуры данных между DLL-ками / DLL - EXE в байтовом виде, влияет ли выравнивание? - C++

19.11.2014, 11:01. Просмотров 335. Ответов 0
Метки (Все метки)

Here i go again
Допустим есть исполняемый файл EXE и динамическая библиотека DLL.
В DLL в хэдэре каком - каком - нибуть объявляю простой тип данных - структура простых POD данных без указателей типа:
C++
1
2
3
4
5
struct DATA_PACK
{
      int x;
      float y;
};
В EXE файле хочу получить эти данные, но есть одно но.
Для полной независимости DLL от EXE данные передаются через указатель void*, так вот вопрос, если я в теле DLL-ке создал объект типа данных DATA_PACK (динамический или статический), заполнил поля и предоставил EXE_шнику указатель на эти данные, а так же вместе с этим указателем передал текстовую строку семантики самого типа, например: "[INT][FLOAT]". (про то что алокаторы разные у DLL и EXE сейчас речи не идёт - я в курсе и по этому указателю в EXE данные буду только читать)
Так вот, в EXE получил я указатель void* на данные в DLL, а так из описание - [INT][FLOAT], то есть я знаю, что по этому указателю лежит сначала один int, потом один float, могу ли я просто взять и прочитать сначала объём данных размеров int-а и заполнить им нужный свой int какой - то, потом со смещением в размер int-а так же прочитать FLOAT?

Казалось бы, конечно так можно сделать, но ведь компиляторы как - то по разному выравнивают структуры данных и ихние поля в памяти, сработает ли такое чтение во всех 100% случаев корректно?

Добавлено через 24 минуты
Ремарка:
DLL:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct DATA_PACK
{
    int x;
    float y;
    int z;
};
...
void *Module::GetData()
{
    DATA_PACK* dp = new DATA_PACK;
    dp->x = 777;
    dp->y = 222.777f;
    dp->z = 333;
    return dp;
}
EXE:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct DATA_PACK_EXE
{
    int x;
    float y;
    int z;
};
 
...
 
DATA_PACK_EXE* dp = new DATA_PACK_EXE;
void* data = nullptr;
data = module->GetData();
memcpy(dp, data, sizeof(DATA_PACK_EXE));
DLL-ка подключается в рантайме динамический.
Так вот, если просто по указателю из DLL скопировать данные в аналогичную структуру в EXE, то вроде как всё нормально и поля правильно заполняются. (аналогичную структуру в ЕХЕ я взял для простоты, на самом деле данные по ихнему описанию нужно будет читать)

Всё бы хорошо, но для передачи данных таким макаром для каждой транзакции требуется вызов new, что очень накладно по времени в условиях множества высокочастотных транзакций.
Я вот подумал, может можно как - то ускорить этот процесс? Обойти алокацию памяти для передачи каждой транзакции?

Я уж думал, может можно как - то статические переменные (которые без оператора new) передавать из DLL В ЕХЕ ...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru