Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Offsetof - struct 
:(
    Опции темы
borisbn
Дата 16.3.2012, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



А не проще создать свой struct (можно без преферанса и балерин), описывающий требуемые данные, затем указателю на этот struct присвоить значение начального адреса, а затем обращаться к полям через этот указатель и через стрелку
Код

#pragma pack(push, 1)
struct MyStruct {
  char dummy1;
  char dummy2;
  long needValue;
} *ptr = (MyStruct*)addr;
#pragma pack(pop)
long val = ptr->needValue;
ptr->needValue = 42;
 

Это сообщение отредактировал(а) borisbn - 16.3.2012, 06:57


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
500mhz
Дата 16.3.2012, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



volatile
инты вполне подходят, так как исполняемый код может быть 32 или 64, а размерность данных все время та же самая остается.

borisbn
да можно и как , вполне рабочий вариант, я так пробовал.
единственное но, после компиляции получается следующее
1) данная структура определяется в памяти как не инициализированые данные
2) *ptr = (MyStruct*)addr; - приводит к копированию части данных (memcpy) на область определенную в пункте 1
что меня не вполне устраивает


--------------------

PM MAIL ICQ   Вверх
borisbn
Дата 16.3.2012, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(500mhz @  16.3.2012,  09:57 Найти цитируемый пост)
данная структура определяется в памяти как не инициализированые данные

объект типа MyStruct нигде не создаётся. создаётся указатель на такую структуру

Цитата(500mhz @  16.3.2012,  09:57 Найти цитируемый пост)
*ptr = (MyStruct*)addr; - приводит к копированию части данных (memcpy)

нет. данные не копируются. делается простое приведение типов (из указателя на char, т.е. из addr, в указатель на MyStruct, т.е. ptr).
а звёздочка перед ptr в моём примере это не разыменовывание указателя, а создание указателя.
Лучше переписать так, чтобы было понятней
Код

#pragma pack(push, 1)
struct MyStruct {
  char dummy1;
  char dummy2;
  long needValue;
};
#pragma pack(pop)
MyStruct * ptr;
ptr = (MyStruct*)addr;
long val = ptr->needValue;
ptr->needValue = 42;



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
500mhz
Дата 16.3.2012, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



Цитата

объект типа MyStruct нигде не создаётся. создаётся указатель на такую структуру

Правильно, в файловой секции он места не занимает, размер который занимает обьект выделяется при загрузке файла.
И туда потом копируется ptr = (MyStruct*)addr; кусок данных размером с MyStruct  (проверено дизасемблером) ))


--------------------

PM MAIL ICQ   Вверх
borisbn
Дата 16.3.2012, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(500mhz @  16.3.2012,  10:53 Найти цитируемый пост)
И туда потом копируется ptr = (MyStruct*)addr; кусок данных размером с MyStruct

не размером MyStruct, а размером MyStruct*, т.е. просто указатель. 4 байта на 32х или 8 байт на 64х. проверено веками)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
500mhz
Дата 16.3.2012, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



попробуй откомпили, нет шас под рукой компилера но есть дизасм )
а я посмотрю


--------------------

PM MAIL ICQ   Вверх
xvr
Дата 16.3.2012, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(500mhz @  16.3.2012,  09:57 Найти цитируемый пост)
инты вполне подходят, так как исполняемый код может быть 32 или 64, а размерность данных все время та же самая остается.

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

Добавлено через 10 минут и 35 секунд
Цитата(500mhz @  16.3.2012,  11:12 Найти цитируемый пост)
попробуй откомпили,

Вот, gcc 64 бита:
Код

#pragma pack(push, 1)
struct MyStruct {
  char dummy1;
  char dummy2;
  long needValue;
};
#pragma pack(pop)
MyStruct * ptr=0;
void func()
{
 ptr = (MyStruct*)0xf00000000;
 long val = ptr->needValue;
 ptr->needValue = 42;
}


Асм слегка подрезал
Код

_Z4funcv:
.LFB2:
; void func()
    pushq    %rbp
.LCFI0:
    movq    %rsp, %rbp
.LCFI1:
.LBB2:
; ptr = (MyStruct*)0xf00000000;
    movl    $0, ptr(%rip)
    movl    $15, ptr+4(%rip)
; long val = ptr->needValue;
    movq    ptr(%rip), %rax
    movq    2(%rax), %rax
    movq    %rax, -8(%rbp)
; ptr->needValue = 42;
    movq    ptr(%rip), %rax
    movq    $42, 2(%rax)
.LBE2:
;}
    leave
    ret

.globl ptr
    .bss
    .align 8
    .type    ptr, @object
    .size    ptr, 8
ptr:
    .zero    8

Как видим никаких MyStruct нигде не заводится, только указатель ptr

Добавлено через 13 минут и 54 секунды
Кстати, оно же с оптимизацией  smile  -
Код

_Z4funcv:
    movabsq    $64424509440, %rax
    movq    %rax, ptr(%rip)
    movq    $42, 2(%rax)
    ret

ptr:
    .zero    8

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0611 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.