Кастинг между несвязанными конгруэнтными классами

Добавьте единственный индекс со столбцами k1-k6 в нем; это должно быть лучшим.

кроме того, если можно выполнить sp_updatestats перед каждым запросом.

6
задан Kara 15 January 2014 в 17:09
поделиться

5 ответов

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

Пока они являются POD, все должно быть в порядке. http://en.wikipedia.org/wiki/Plain_old_data_structures

Согласно стандарту (1.8.5)

«Если это не битовое поле (9.6), наиболее производный объект должен иметь ненулевого размера и должен занимать один или несколько байтов место хранения. Подобъекты базового класса могут иметь нулевой размер. Объект POD5) тип (3.9) должен занимать смежные байты хранилище. "

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

2
ответ дан 17 December 2019 в 20:33
поделиться

Если две структуры POD начинаются с одной и той же последовательности элементов, стандарт гарантирует, что вы сможете получить к ним доступ свободно через союз. Вы можете сохранить A :: Point3D в объединении, а затем читать из члена B :: Point3D, пока вы касаетесь только тех членов, которые являются частью начальной общей последовательности. (так что если одна структура содержит int, int, int, float, а другая содержит int, int, int, int, вам будет разрешен доступ только к трем первым int).

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

Конечно, все это предполагает, что обе структуры скомпилированы одним и тем же компилятором, чтобы гарантировать идентичный ABI .

2
ответ дан 17 December 2019 в 20:33
поделиться

Я точно знаю, что это не сработает:

  • обе структуры имеют разное выравнивание;
  • скомпилированы с разными параметрами RTTI

могут быть еще какими-то ...

-2
ответ дан 17 December 2019 в 20:33
поделиться

Следующее довольно безопасно:

namespace A {
  struct Point3D {
    float x,y,z;
  };
}

namespace B {
    typedef A::Point3D Point3D;
}

int main() {
    A::Point3D a;
    B::Point3D* b = &a;

    return 0;
}
0
ответ дан 17 December 2019 в 20:33
поделиться

Эта строка должна быть:

B::Point3D* pb = (B::Point3D*)&pa;

Обратите внимание на и . Я думаю, что вы делаете reinterpret_cast между двумя указателями. Фактически вы можете переинтерпретировать_приведение любого типа указателя к другому, независимо от типа двух указателей. Но это небезопасно и не переносимо.

Например,

int x = 5;
double* y = reinterpret_cast<double*>(&x);

Вы просто используете C-стиль, поэтому вторая строка фактически равна:

double* z = (double*)&x;

Я просто ненавижу C-Style при кастинге, потому что вы не могу определить цель гипса с одного взгляда :)


При каких обстоятельствах это гарантированно работает?

Это не реальное преобразование между типами. Например,

int i = 5;
float* f = reinterpret_cast<float*>(&i);

Now f указывает на то же место, на которое указывает i . Итак, преобразование не производится. При разыменовании f вы получите значение с плавающей запятой с тем же двоичным представлением целого числа i . На моей машине это четыре байта.

0
ответ дан 17 December 2019 в 20:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: