C ++ объект в памяти - PullRequest
       16

C ++ объект в памяти

3 голосов
/ 25 марта 2010

Существует ли стандарт для хранения объектов C ++ в памяти? Я хочу установить указатель char * на определенный адрес в памяти, чтобы я мог считывать переменные определенных объектов непосредственно из байта памяти. Когда я использую Dev C ++, переменные хранятся по одной прямо в адресе памяти объекта в том порядке, в котором они были определены. Теперь, может ли он быть другим при использовании другого компилятора (например, переменные в другом порядке или где-то еще)? Заранее спасибо. : -)

Ответы [ 10 ]

3 голосов
/ 25 марта 2010

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

Можете ли вы дать нам некоторые детали того, что вы пытаетесь сделать?

3 голосов
/ 25 марта 2010

Насколько я знаю, переменные не могут быть в другом порядке.Тем не менее, между членами могут быть разные величины заполнения.Кроме того, я думаю, что все ставки сделаны с виртуальными классами, и различные реализации пользовательских типов (таких как std :: string) могут быть совершенно разными в разных библиотеках (или даже в опциях сборки).

Это выглядит как оченьподозрительная вещь, чтобы сделать.Для чего вам это нужно: для доступа к частным пользователям?

1 голос
/ 25 марта 2010

Компилятору C ++ не разрешается изменять порядок переменных в блоке видимости (общедоступном, защищенном и т. Д.). Но разрешено переупорядочивать переменные в отдельных блоках видимости. Например:

struct A {
    int a;
    short b;
    char c;
};

struct B {
    int a;
public:
    short b;
protected:
    char c;
};

В приведенном выше примере переменные в A всегда будут располагаться в порядке a, b, c. Переменные в B могут быть расположены в другом порядке, если компилятор выбрал. И, конечно же, существуют требования к выравниванию и упаковке, поэтому между некоторыми переменными при необходимости могут быть пробелы.

1 голос
/ 25 марта 2010

Реализации могут делать все, что хотят: P. Однако, поскольку C ++ должен обращаться к определенным стилям программирования, вы найдете детерминированный способ доступа к вашим полям для вашей конкретной архитектуры компилятора / платформы / процессора.

Если ваш порядок байтов варьируется на другом компиляторе, мое первое предположение будет связано с проблемами упаковки байтов. Если вам нужно, чтобы у класса был определенный определенный порядок байтов, сначала посмотрите директивы #pragma pack для вашего компилятора ... вы можете изменить порядок упаковки на что-то менее оптимальное, но детерминированное. Обратите внимание, что этот совет обычно относится к типам данных POD.

0 голосов
/ 23 июня 2014

http://dieharddeveloper.blogspot.in/2013/07/c-memory-layout-and-process-image.html

В середине адресного пространства процесса находится область, зарезервированная для общих объектов. Когда создается новый процесс, диспетчер процессов сначала отображает два сегмента из исполняемого файла в память. Затем он декодирует ELF-заголовок программы. Если заголовок программы указывает, что исполняемый файл был связан с общей библиотекой, менеджер процессов (PM) извлечет имя динамического интерпретатора из заголовка программы. Динамический интерпретатор указывает на общую библиотеку, которая содержит код компоновщика во время выполнения.

0 голосов
/ 26 марта 2010

Похоже, что вы действительно хотите спросить, как сериализовать ваши объекты

0 голосов
/ 26 марта 2010

Звучит так, как будто вы хотите распределить объекты между машинами через соединение TCP / IP. Возможно, вам это сойдет с рук, если код был скомпилирован с одним и тем же компилятором на каждом конце, иначе я не уверен. Имейте в виду, что если платформы могут быть разными, вам, возможно, придется учитывать разные порядковые номера процессоров!

0 голосов
/ 25 марта 2010

Я работал с чем-то, что делало это профессионально, и, насколько я могу судить, это работало очень конкретно, потому что он декодировал что-то, закодированное другим инструментом, поэтому мы всегда знали, точно , как это работает.

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

По сути, вы можете сделать это, если вы точно знаете, как все строится на побайтном уровне. (Возможно, вам удастся узнать, когда он сконструирован таким же образом, что сэкономит немного времени и знаний)

0 голосов
/ 25 марта 2010

Порядок переменных никогда не должен изменяться, но, как говорили другие, упаковка байтов будет меняться. Еще одна вещь, которую следует учитывать, - это порядковый номер платформы.

Чтобы обойти проблему выравнивания / упаковки байтов, большинство компиляторов предлагают какой-то способ управления процессом. В gcc вы можете использовать __attribute__((__packed__)) и в msvc #pragma pack.

0 голосов
/ 25 марта 2010

При работе с многомерными массивами имейте в виду, что они хранятся в Главном порядке строк .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...