русский
Germany.ruForen → Архив Досок→ Programmierung

Что такое sizeof()?

275  
rahimov80 завсегдатай26.01.07 17:11
NEW 26.01.07 17:11 
У меня есть структура, в ней поля Type1 m_field1, Type2 m_field2, Type3 m_field3, etc. Я делаю сериализацию для этой структуры и хочу знать смещение для field3 : st_Offset_Of_Field3. Так как, эта переменная, конечно одинакова для всех объектов/instances, то определяю его как static. Корректно?
Как посчитать st_Offset_Of_Field3? Вроде бы просто: st_Offset_Of_Field3 = sizeof(m_field1) + sizeof(m_field2);
Но компилятор ругается (GCC): обращаюсь из статик переменной к non-static полю. А какая разница для sizeof - значение же высчитывается в compile-time, а не в run-time?
P.S. Я знаю workaround: st_Offset_Of_Field3 = sizeof(Type1) + sizeof(Type2); Но если завтра, кто-нибудь с "кривыми руками" поменяет Type1 на Тype5 и забудет это сделать для st_Offset_Of_Field3? А у меня соответственно и таких полей куча, и структур, и типов, и смешений...
#1 
  scorpi_ коренной житель26.01.07 17:43
NEW 26.01.07 17:43 
in Antwort rahimov80 26.01.07 17:11
В ответ на:
#include <iostream>
struct A
{
int i;
double d;
char c;
unsigned short s;
};
#pragma pack(1)
struct B
{
int i;
double d;
char c;
unsigned short s;
};
int main()
{
std::cout << "struct A, default alignment:\n"
<< offsetof( A, i ) << "\n"
<< offsetof( A, d ) << "\n"
<< offsetof( A, c ) << "\n"
<< offsetof( A, s ) << "\n"
<< std::endl;
std::cout << "struct B, packed:\n"
<< offsetof( B, i ) << "\n"
<< offsetof( B, d ) << "\n"
<< offsetof( B, c ) << "\n"
<< offsetof( B, s ) << "\n"
<< std::endl;
}


Память для статических членов резервируется в другом месте.
#2 
rahimov80 завсегдатай26.01.07 18:26
NEW 26.01.07 18:26 
in Antwort scorpi_ 26.01.07 17:43
1. Я знаю что такое #pragma pack , alignment in struct, etc
2. Я делаю serializing, то есть пишу/читаю в стрим, файл и т.д. поля не обязательно в том же порядке как они представленны в структуре, так что алигмент меня не интересует, как и их offset в самой струтуре, а не оффсет в streame.
3. Проблема была подсчитать сумму sizeof_ов не в ран-тайме, как у Вас, а в compilation time и назначить е╦ статик переменной.
4. Кстати, трюк с offsetof помогает для проблемы #3. То есть,
st_Offset_Of_Field3 = sizeof(((MyClass*)0)->m_field1) + sizeof((((MyClass*)0)->m_field2);
и обращаюсь из статик контекста к ВРОДЕ БЫ статик переменным.
5. Трюк из #4 работал, я перешел на GCC: трюк работает, но появилась куча (здесь не печатное слово) warnings:
В ответ на:
warning: invalid access to non-static data member `SatelliteChannel_Tag::m_enPolarization' of NULL object
warning: (perhaps the `offsetof' macro was used incorrectly)

Как погасить этот тип предупреждения пока не знаю.
П>С> _scorpi, я хотел бы с Вами связаться по прайвед вопросу (проконсультироватся относительно японских ножей), но у Вас все контакты закрыты (только для друзей), так что если Вас не затруднит пошлите мне ЕМаил
#3 
  scorpi_ коренной житель26.01.07 19:22
NEW 26.01.07 19:22 
in Antwort rahimov80 26.01.07 18:26
Называй переменные правильно, тогда никто не будет путаться. Кто ж догадается, что под оффсетом ты понимаешь размер?
Невозможность взять размер члена класса это действительно недоработка в стандарте и есть предложение это исправить - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2150.html
Пока это дейстительно работает через трюк. В настоящий момент gcc под рукой нет, поэтому на 5. сейчас ответить не могу. Вообще мне кажется этот трюк был в бусте красиво оформленный и подогнанный к разным компайлерам, но вот найти его сейчас не могу. Кстати в бусте есть библиотека для сериализации, может не стоит велосипед изобретать?
offop Личка у меня открыта, но я разве спец? Это к симплу /offtop
#4 
rahimov80 завсегдатай26.01.07 19:48
NEW 26.01.07 19:48 
in Antwort scorpi_ 26.01.07 19:22
"оффсет" - Ну это скажем оффсет для поля в данном рекорде (один обект - один рекорд), если я хочу туда попасть минуя десериализацию.
За ссылку спасибо, это именно моя проблема, ну что-ж, "будем ждать" (Ц)
Насчет буста - у меня реал-тайм: себя бы в память запихнуть, а если ещ╦ и библиотеки: на STL места нет. Реал-тайм это прибежище C-шников, для них C++ уже по определению overhead

Да личка уже открылась, ну я уже из дома посмотрю - хватит работать на сегодня
#5 
  scorpi_ коренной житель26.01.07 23:27
NEW 26.01.07 23:27 
in Antwort rahimov80 26.01.07 19:48, Zuletzt geändert 26.01.07 23:29 (scorpi_)
Я ж помнил, что существовало другое, более чистое решение! Опять помог Джеймс Канце - http://groups.google.com/group/comp.lang.c++.moderated/msg/921505029dbbd252
В ответ на:
#include <iostream>
template< typename C, typename T >
T memberType( T C::* );
struct A
{
double d;
int i;
static int const size_a;
};
int const A::size_a = sizeof( memberType( &A::d ) )
+ sizeof( memberType( &A::i ) );
int main()
{
std::cout << A::size_a << std::endl;
}
12


#6 
Simple Nothing is f*cked28.01.07 10:19
Simple
NEW 28.01.07 10:19 
in Antwort rahimov80 26.01.07 18:26
У нас это делается через union.
Что у тебя за вопрос такой по ножам? :)
#7 
  scorpi_ коренной житель28.01.07 15:41
NEW 28.01.07 15:41 
in Antwort Simple 28.01.07 10:19
У нас это делается через union.
???
#8 
Simple Nothing is f*cked29.01.07 12:43
Simple
NEW 29.01.07 12:43 
in Antwort scorpi_ 28.01.07 15:41
    union uIdentifier 
{
char all[stIdentifierSize];
#pragma pack( push, 1 )
struct stIdentifier
{
char fehler[3]; // Fehlercode
char name[28]; // Patientenname
char vorname[28]; // Patientenvorname
char gebDatum[8]; // Patientengeburtsdatum
char nr[10]; // Patientennummer
} sIdentifier;
#pragma pack( pop )
char test[sizeof(stIdentifier) == stIdentifierSize];
} identifier_;

Хотя мож я не понял вопроса.

#9 
rahimov80 завсегдатай29.01.07 13:35
NEW 29.01.07 13:35 
in Antwort scorpi_ 26.01.07 23:27
Спасибо. Трюк действительно красивый и кроме этого работает!
Но скорее познавательный: я уже нашел как в GCC warnings убить - не один я на них жалуюсь -Wno-invalid-offsetof "invalid offsetof from non-POD type"
#10 
rahimov80 завсегдатай29.01.07 13:52
NEW 29.01.07 13:52 
in Antwort Simple 29.01.07 12:43
Про union это наверное не совсем по теме: вы stIdentifierSize сами считаете? а если завта измените "nr" с char[10] просто на long, то будете пересчитывать?
По поводу ножей:
Вы как-то обменивались информацией о японских ножах (ссылку на тред, к сожелению, не сохранил).
Я хочу подарить жене кухонный японский нож, но ничего в них не понимаю, баджет 50-75 евро. По советуйте что-то, чтоб "одаряемый" оценил, она как раз, ими и будет пользоватся.
#11 
Simple Nothing is f*cked29.01.07 14:09
Simple
NEW 29.01.07 14:09 
in Antwort rahimov80 29.01.07 13:52
Сверху в коде константа, я ее не стал копировать. Так что да, придется все ручками переписывать, наверно (код не мой). Специфика.
Недавно опять была ветка о ножах, я там приводил ссылку на старую: http://foren.germany.ru/haus/f/7001203.html
Ты умеешь правильно точить нож? Я спрашиваю, потому что японский надо уметь точить самому (желательно), а немецкий типа Henckels Zwilling сам не заточишь. Недавно я пробовал у друга "близнеца", и он не очень понравился.
В твой бюджет вполне укладывается тот нож, который взял scorpi_, так что жена будет довольна, я думаю :) А моя ваще боится прикасаться к моему большому ножу ;)
- Just one thing, Dude. D'ya have to use s'many cuss words?
- The f*ck are you talking about?
(c)
Все о бильярде
#12 
rahimov80 завсегдатай29.01.07 14:55
29.01.07 14:55 
in Antwort Simple 29.01.07 14:09
Именно этого я и пытаюсь избежать: пересчитывать длину и т.д. Но вроде бы, с помощью _scorpi разобрались: и куча (2) трюков, и проблемы в стандарте, и т.д.
Так какой-же нож купил _scorpi? А относительно заточки: а нельзя ли найти самозатачивающийся нож?
Большой нож? Я много слышал о спорах: что важнее для ножа - уменее пользоватся или размер. Так что ответ уже найден?
#13 
Simple Nothing is f*cked29.01.07 15:46
Simple
NEW 29.01.07 15:46 
in Antwort rahimov80 29.01.07 14:55
scorpi_ купил_ если не ошибаюсь, H06 отсюда: http://kochmesser.de/haiku.html
Хороший нож можно долго не точить, но уметь бы было неплохо. Научиться в принципе не так и трудно, на kochmesser.de есть обучающее видео.
Величина ножа зависит от его назначения. Маленьким или тонким ножом резать овощи не сильно удобно ;)
#14 
Tomasson знакомое лицо30.01.07 13:41
Tomasson
NEW 30.01.07 13:41 
in Antwort Simple 29.01.07 15:46
В ответ на:
на kochmesser.de есть обучающее видео

насчет видео хотелось бы узнать по-подробнее:-)
про любые видео. Как пользоваться тем или иным ножом.
#15 
Simple Nothing is f*cked30.01.07 15:21
Simple
Tomasson знакомое лицо30.01.07 18:52
Tomasson
NEW 30.01.07 18:52 
in Antwort Simple 30.01.07 15:21
спасибо:-)
а еще видео есть? Как правильно пользоваться разными ножами.
#17 
Simple Nothing is f*cked30.01.07 19:11
Simple
NEW 30.01.07 19:11 
in Antwort Tomasson 30.01.07 18:52
Больше не видел. Я уже как-то выкладывал видео себя ;) Но мне еще учиться и учиться.
#18 
Tomasson знакомое лицо30.01.07 21:38
Tomasson
NEW 30.01.07 21:38 
in Antwort Simple 30.01.07 19:11
В ответ на:
уже как-то выкладывал видео себя

рыпыт, плыз
#19 
Simple Nothing is f*cked31.01.07 00:38
Simple
NEW 31.01.07 00:38 
in Antwort Tomasson 30.01.07 21:38
Да уже давно стерто и забыто :) Ищи в той давней теме, мож сохранилось где.
#20