Re[8]: Пропертя
От: johny5 Новая Зеландия
Дата: 14.05.12 02:09
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, johny5, Вы писали:


J>>Замечательно работало, правда использовал лишь единожды да и помоему позднее таки выкинул.

J>>Если нужно, могу впостить код целиком.

E>UB на UB + виртуальная база всё нагнёт...


UB там нет, разве что используется "фича" MSVC собственно компилять шаблон в месте использования.
А виртуальная база.. наследование тут никак не касается смещений к полям в структуре, они фиксированы относительно владеющего пропертью класса.
Re[9]: Пропертя
От: Erop Россия  
Дата: 14.05.12 05:21
Оценка: +1
Здравствуйте, johny5, Вы писали:

J>UB там нет, разве что используется "фича" MSVC собственно компилять шаблон в месте использования.

J>А виртуальная база.. наследование тут никак не касается смещений к полям в структуре, они фиксированы относительно владеющего пропертью класса.

(const OwnerType*)(((const char*)this) - OFFSETOF(OwnerType, OwnerType::PropertyName));

Это, по твоему, не UB?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Пропертя
От: Erop Россия  
Дата: 14.05.12 05:27
Оценка:
Здравствуйте, johny5, Вы писали:

J>А виртуальная база.. наследование тут никак не касается смещений к полям в структуре, они фиксированы относительно владеющего пропертью класса.


Что даёт такие гарантии?

Я понимаю, что если уж надо выкручиваться, то приходится хаккать. Но это именно хакки, а не промышленное решение. Другое дело, если бы такой сервис можно было бы обеспечить на уовне языка, так же, как и указатели на члены, например.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: Пропертя
От: johny5 Новая Зеландия
Дата: 14.05.12 05:34
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, johny5, Вы писали:


J>>А виртуальная база.. наследование тут никак не касается смещений к полям в структуре, они фиксированы относительно владеющего пропертью класса.


E>Что даёт такие гарантии?

Эм, что поля в классе не скачут с места на место?


E>Я понимаю, что если уж надо выкручиваться, то приходится хаккать. Но это именно хакки, а не промышленное решение. Другое дело, если бы такой сервис можно было бы обеспечить на уовне языка, так же, как и указатели на члены, например.


Я бы не сказал что моя обёртка такие уж "хаки", нормальная типобезопасная имплементация, пусть кривоват синтаксис но если надо... Плюс, есть же __declspec( property .. пусть даже непортируемое.
Re[10]: Пропертя
От: johny5 Новая Зеландия
Дата: 14.05.12 05:46
Оценка: +1
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, johny5, Вы писали:


J>>UB там нет, разве что используется "фича" MSVC собственно компилять шаблон в месте использования.

J>>А виртуальная база.. наследование тут никак не касается смещений к полям в структуре, они фиксированы относительно владеющего пропертью класса.

E>
(const OwnerType*)(((const char*)this) - OFFSETOF(OwnerType, OwnerType::PropertyName));

E>Это, по твоему, не UB?

По стандарту, строго говоря, да, делать какую то арифметику с this нехорошо. Но это UB для абстрактного компилятора в вакууме. Практически это 100% стабильно работает к примеру MSVC (ибо целочисленная арифметика с указателями даёт желаемое). И я думаю заведётся под все остальные среды исполнения. Сейчас мне в голову даже не приходит что может помешать подобной арифметике работать неверно.
Re[11]: Пропертя
От: Erop Россия  
Дата: 14.05.12 11:04
Оценка:
Здравствуйте, johny5, Вы писали:

E>>Что даёт такие гарантии?

J>Эм, что поля в классе не скачут с места на место?

Что смещение от this не изменится ни в каком MDT...

J>Я бы не сказал что моя обёртка такие уж "хаки", нормальная типобезопасная имплементация, пусть кривоват синтаксис но если надо... Плюс, есть же __declspec( property .. пусть даже непортируемое.


Ну да. Беда только в том, что проперти в С++ вообще криво смотрятся. И вообще это всё в целом криво.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: Пропертя
От: Erop Россия  
Дата: 14.05.12 11:07
Оценка:
Здравствуйте, johny5, Вы писали:

J>По стандарту, строго говоря, да, делать какую то арифметику с this нехорошо. Но это UB для абстрактного компилятора в вакууме. Практически это 100% стабильно работает к примеру MSVC (ибо целочисленная арифметика с указателями даёт желаемое). И я думаю заведётся под все остальные среды исполнения. Сейчас мне в голову даже не приходит что может помешать подобной арифметике работать неверно.


Строго говоря уже OFFSETOF -- MS-spec...
И в MSDN'е про него вроде писали, что тока к POD применять мона...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: Пропертя
От: Piko  
Дата: 14.05.12 11:10
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, johny5, Вы писали:


J>>По стандарту, строго говоря, да, делать какую то арифметику с this нехорошо. Но это UB для абстрактного компилятора в вакууме. Практически это 100% стабильно работает к примеру MSVC (ибо целочисленная арифметика с указателями даёт желаемое). И я думаю заведётся под все остальные среды исполнения. Сейчас мне в голову даже не приходит что может помешать подобной арифметике работать неверно.


E>Строго говоря уже OFFSETOF -- MS-spec...

E>И в MSDN'е про него вроде писали, что тока к POD применять мона...

http://www.cplusplus.com/reference/clibrary/cstddef/offsetof/
Re[11]: Пропертя
От: Piko  
Дата: 14.05.12 11:14
Оценка:
Здравствуйте, johny5, Вы писали:

J>>>UB там нет, разве что используется "фича" MSVC собственно компилять шаблон в месте использования.

J>>>А виртуальная база.. наследование тут никак не касается смещений к полям в структуре, они фиксированы относительно владеющего пропертью класса.
E>>
(const OwnerType*)(((const char*)this) - OFFSETOF(OwnerType, OwnerType::PropertyName));

E>>Это, по твоему, не UB?
J>По стандарту, строго говоря, да, делать какую то арифметику с this нехорошо.

можно попробовать не использовать вообще offsetof, а вычислять смещение в runtime, один раз для каждой пары (класс,его property), то есть хранить такие смещения в глобальном объекте.
насколько это UB?
Re[13]: Пропертя
От: Erop Россия  
Дата: 14.05.12 11:24
Оценка:
Здравствуйте, Piko, Вы писали:

E>>Строго говоря уже OFFSETOF -- MS-spec...

E>>И в MSDN'е про него вроде писали, что тока к POD применять мона...

P>http://www.cplusplus.com/reference/clibrary/cstddef/offsetof/


1) В С++ большие и маленькие буквы ОТЛИЧАЮТСЯ!!!
2)

Because of the extended functionality of structs in C++, in this language, the use of offsetof is restricted to "POD types", which for classes, more or less corresponds to the C concept of struct (although non-derived classes with only public non-virtual member functions and with no constructor and/or destructor would also qualify as POD).

Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[14]: Пропертя
От: Piko  
Дата: 14.05.12 11:27
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Piko, Вы писали:


E>>>Строго говоря уже OFFSETOF -- MS-spec...

E>>>И в MSDN'е про него вроде писали, что тока к POD применять мона...

P>>http://www.cplusplus.com/reference/clibrary/cstddef/offsetof/


E>1) В С++ большие и маленькие буквы ОТЛИЧАЮТСЯ!!!


НИ ЕДИНОГО РАЗРЫВА!
да, я знаю

E>2)

Because of the extended functionality of structs in C++, in this language, the use of offsetof is restricted to "POD types", which for classes, more or less corresponds to the C concept of struct (although non-derived classes with only public non-virtual member functions and with no constructor and/or destructor would also qualify as POD).


да, я видел, и?
Re[15]: Пропертя
От: Erop Россия  
Дата: 14.05.12 11:31
Оценка:
Здравствуйте, Piko, Вы писали:

P>да, я видел, и?

И
1) OFFSETOF таки MS-специфик
2) Оба макроса требуют, что бы объемлющий класс был POD...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: Пропертя
От: Erop Россия  
Дата: 14.05.12 11:35
Оценка:
Здравствуйте, Piko, Вы писали:

P>можно попробовать не использовать вообще offsetof, а вычислять смещение в runtime, один раз для каждой пары (класс,его property), то есть хранить такие смещения в глобальном объекте.

P>насколько это UB?

Гарантий тоже не будет.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: Пропертя
От: Piko  
Дата: 14.05.12 11:43
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Piko, Вы писали:


P>>можно попробовать не использовать вообще offsetof, а вычислять смещение в runtime, один раз для каждой пары (класс,его property), то есть хранить такие смещения в глобальном объекте.

P>>насколько это UB?
E>Гарантий тоже не будет.

То есть разница между двумя this, в случае когда один класс агрегирует другой, может быть разной для разных инстансов агрегирующего класса?
Re[14]: Пропертя
От: Erop Россия  
Дата: 14.05.12 13:39
Оценка:
Здравствуйте, Piko, Вы писали:

P>То есть разница между двумя this, в случае когда один класс агрегирует другой, может быть разной для разных инстансов агрегирующего класса?


Оно, вроде как, может быть даже невычислимо, или неопределено...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[15]: Пропертя
От: Piko  
Дата: 14.05.12 17:13
Оценка:
Здравствуйте, Erop, Вы писали:

P>>То есть разница между двумя this, в случае когда один класс агрегирует другой, может быть разной для разных инстансов агрегирующего класса?

E>Оно, вроде как, может быть даже невычислимо, или неопределено...

что не вычислимо?
нельзя кастануть указатели разных типов к void* и вычислить разницу между ними?
Re[16]: Пропертя
От: Piko  
Дата: 14.05.12 17:16
Оценка:
Здравствуйте, Piko, Вы писали:

P>что не вычислимо?

P>нельзя кастануть указатели разных типов к void* и вычислить разницу между ними?

в смысле char*
Re[16]: Пропертя
От: Erop Россия  
Дата: 14.05.12 17:29
Оценка:
Здравствуйте, Piko, Вы писали:

P>нельзя кастануть указатели разных типов к void* и вычислить разницу между ними?


А разве есть гарантии, что объект всегда будет лежать в одном сегменте памяти?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[17]: Пропертя
От: Piko  
Дата: 14.05.12 18:00
Оценка:
Здравствуйте, Erop, Вы писали:

P>>нельзя кастануть указатели разных типов к void* и вычислить разницу между ними?

E>А разве есть гарантии, что объект всегда будет лежать в одном сегменте памяти?

вы о чём вообще?
Re[18]: Пропертя
От: Erop Россия  
Дата: 14.05.12 20:20
Оценка:
Здравствуйте, Piko, Вы писали:

P>>>нельзя кастануть указатели разных типов к void* и вычислить разницу между ними?

E>>А разве есть гарантии, что объект всегда будет лежать в одном сегменте памяти?

P>вы о чём вообще?



Вообще-то в С++ можно вычетать не любые два указателя, а только два указателя внутрь одногои того же сегмента памяти...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.