LINUX.ORG.RU

Если есть конструктор, то это не POD. C не-POD структурой такой код платформозависим, насколько я понимаю.

Absurd ★★★
()

А оно не играет роли. Если компилится и автор ещё под рукой - дать по рукам и заставить переписывать. Не компилится - переписывать.

tia
()
Ответ на: комментарий от Dudraug

>А если нет конструктора?

Ну на структурах Си такие трюки иногда используют, например для эмуляции наследования.

Absurd ★★★
()

Нет, не по стандарту. Вообще, сишное приведение в с++ - зло. Это компиле/платформо зависимо.

panter_dsd ★★★★
()

В gcc есть опция -pedantic, которая варнигом показывает код не соответствующий стандарту.

anonymous
()

По стандарту, но если, скажем, в классе A появится виртуальный метод будет непредсказуемое поведение

anonymous
()

стандарт не запрещает так писать, если тебя это интересует; другое дело, что и гарантий на работу с сырой памятью ты получить не можешь практически никогда. не повезёт - получишь UB

jtootf ★★★★★
()
Ответ на: комментарий от anonymous

сжечь все экземпляры кода. вместе с репозиторием. и бекапами.

anonymous
()
Ответ на: комментарий от namezys

>> Если есть конструктор, то это не POD

Не правда

Если сказал А, то надо сказать Б. Завел конструктор - делай заодно конструктор копирования и оператор присваивания. Александреску, если ему нужен четко POD, в подобной структуре сделает два статических метода - void A::Init(A*) и void A::Destroy(A*). Я придерживаюсь той же позиции и ньюансы т.н. Стандарта меня мало колышат.

Absurd ★★★
()
Ответ на: комментарий от Absurd

Кого колышит, а кого нет.

Я вполен обхожусь тем, что генерит компилятор. А вот инициализировать структуру каждый раз считаю делом неблагодарным, так что пустой конструктор есть у меня уу любой POD страктуры

namezys ★★★★
()
Ответ на: комментарий от Absurd

Если сказал А, то надо сказать Б

речь об определениях, а не о практиках. определение POD есть в стандарте

позиции и ньюансы т.н. Стандарта меня мало колышат.

а вот это уже печально

jtootf ★★★★★
()

На мой взгляд

вот тут:

struct A
{
   A():AA(4),BB('a'){}
    int AA;
    char B;

};

Все в порядке.

А вот тут:

A *pa = new A();
if (4 == *((int *) pa)){...}
надо применить расстрел создателя кода и переписать по новой. После этого тоже все будет в порядке.

trex6 ★★★★★
()
Ответ на: комментарий от anonymous

В gcc есть опция -pedantic, которая варнигом показывает код не соответствующий стандарту.

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

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

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

Все иксы на подобных кастах построены. В туториалах MS есть и более грязные хаки (помню приведение void(*)(T*) к void(*)(const U&), где T является первым и единственным полем в классе U). В принципе, данный код будет работать на любом реальном компиляторе С++, даже если эту структуру сделать не-POD.

Absurd ★★★
()
Ответ на: комментарий от anonymous

>Будет UB, если туда добавить виртуальный метод.

По-моему все реальные компиляторы С++ скрытый указатель на таблицу виртуальных методов всегда пихают после полей класса, а не до.

Absurd ★★★
()

Это крайне плохой код. До ужасного плохой код.

grebtsov
()
Ответ на: комментарий от namezys

>А то, что порядом следвоания полей меняется, вы не слышали?

Кем меняется? Если ты добавил, например, виртуальный деструктор то конце структуры появится просто неявное поле __pvtbl<манглинг>, указывающее на массив указателей на функции-члены класса. И все, собственно. Начало структуры не изменится. Причин его менять тоже не существует, поэтому его никто и не меняет. Конечно, это не причина писать говнокод, да.

Absurd ★★★
()
Ответ на: комментарий от Absurd
#include <stdio.h>

struct A {
	A() : x(0) {}

	virtual void foo() {}

	unsigned int x;
};

int main()
{
	A* a = new A();
	printf("%d\n", *((int*)a));
	return 0;
}

MSVS2008: 4286726

anonymous
()
Ответ на: комментарий от Absurd

Ну что за упертость. Порядок расположения элементов структуры в памяти опредлено только для POD типов. В остальных случаях - произвольно

namezys ★★★★
()
Ответ на: комментарий от anonymous

А что они туда в начало класса зафигачили - не ковырял?

Вообще, в VC++ бинарный формат класса всегда был зафиксирован по причине совместимости с COM, так что это сюрприз для меня.

Absurd ★★★
()
Ответ на: комментарий от Absurd

> Вообще, в VC++ бинарный формат класса всегда был зафиксирован по причине совместимости с COM

Именно по этой причине первым и ложится указатеь на таблицу виртуальных функци - com работает именно с ней

namezys ★★★★
()
Ответ на: комментарий от Absurd

Ну по выводу можно было догадаться что указатель на таблицу виртуальных функций :).

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

anonymous
()
Ответ на: комментарий от anonymous

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

Ну в момент компиляции смещение к искомому pvtbl всегда ясно из статического контекста я так понимаю, так как для virtual call-а завершенные декларации и класса и его предков должны находиться в текущем scope. Хотя с другой стороны да, если pvtbl всегда идет с нулевым смещением, то многие вещи упрощаются. Это был мой пробел.

Absurd ★★★
()
Ответ на: комментарий от panter_dsd

> Вообще, сишное приведение в с++ - зло. Это компиле/платформо зависимо.

это не так. Вовсе не любое сишное приведение в с++ компиле/платформо зависимо.

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

[code=cpp]if (4 == pa->AA) {...}[/code]

кэп?

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от dilmah

Это компиле/платформо зависимо

Относилось к сишному касту структур.

panter_dsd ★★★★
()
Ответ на: комментарий от namezys

Если все члены класса public порядок таки определен Стандарт C++ 9.2.12

Nonstatic data members of a (non-union) class declared without an intervening access-specifier are allocated so that later members have higher addresses within a class object. The order of allocation of non static data members separated by an access-specifier is unspecifie (11.1). Implementation alignment requirements might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).

anonymous
()
Ответ на: комментарий от anonymous

То есть получается что слова public, protected, private вообще не должны появляться. Но это безсмысленно для класса, имхо

тут загвозка. А где говориться о вырвании POD?

namezys ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.