Скажем, у вас есть эти два типа:
struct alignas(8) Base { double a; double b; }
struct alignas(16) Derived : public Base {}
И эти функции:
void Foo(Base b)
void Bar(Base* start, Base* end)
Законно ли совершать звонки, такие как
Foo(someDerived)
Bar(someDerivedArray, someDerivedArray + arrayLength)
во всехслучаи?Зависит ли это от содержимого Base
и конкретных ограничений выравнивания?Я мог бы видеть, что есть проблема, если бы derived
были, скажем, 32-битными выровненными, потому что тогда был бы промежуток между элементами someDerivedArray
, и Bar
не знал бы об этом разрыве, поэтомуЯ предполагаю, что это неопределенное поведение, но я не уверен.
XY объяснение: мы используем библиотеку Thrust GPGPU, и ее сложный тип имеет несовместимые выравнивания между кодом устройства и кодом хоста;мы пытаемся выяснить, как обойти эту проблему.Один из вариантов - определить наш собственный сложный тип, производный от thrust::complex
, но с тем же спецификатором выравнивания и использовать его, но, конечно, различные функции тяги ожидают thrust::complex
, поэтому мы будем нарезать или приводить в менее выровненныйтип.