例如,我有这个结构
struct A {
float x;
float y;
float z;
};
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?A a; float* array = (float*)&a;
并使用as float数组?
将双数组转换为由双精度构成的结构是否可以?
struct A
{
double x;
double y;
double z;
};
int main (int argc , char ** argv)
{
double arr[3] = {1.0,2.0,3.0};
A* a = static_cast<A*>(static_cast<void*>(arr));
std::cout << a->x << " " << a->y << " " << a->z << "\n";
}
Run Code Online (Sandbox Code Playgroud)
这打印1 2 3.但它是否保证每次都可以与任何编译器一起工作?
编辑:根据
9.2.21:指向标准布局结构对象的指针,适当转换?使用reinterpret_cast,指向其初始成员(...),反之亦然.
如果我用我的代码替换
struct A
{
double & x() { return data[0]; }
double & y() { return data[1]; }
double & z() { return data[2]; }
private:
double data[3];
}; …Run Code Online (Sandbox Code Playgroud) 这是一个严格的别名问题,因为编译器会因此引起任何优化顺序问题。
假设我float在一个中有三个public struct XMFLOAT3(与这个不同)。我想强制转换成一个float*。这会使我陷入优化麻烦吗?
XMFLOAT3 foo = {1.0f, 2.0f, 3.0f};
auto bar = &foo.x;
bar[2] += 5.0f;
foo.z += 5.0f;
cout << foo.z;
Run Code Online (Sandbox Code Playgroud)
我认为这将始终打印“ 13”。但是这段代码呢:
XMFLOAT3 foo = {1.0f, 2.0f, 3.0f};
auto bar = reinterpret_cast<float*>(&foo);
bar[2] += 5.0f;
foo.z += 5.0f;
cout << foo.z;
Run Code Online (Sandbox Code Playgroud)
我认为这是合法的,因为根据http://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasing
T2是聚合类型或联合类型,其将上述类型之一作为元素或非静态成员(递归地包括子聚合的元素和所包含的联合的非静态数据成员):这样可以安全地进行强制转换从结构的第一个成员到联合的元素,再到包含它的结构/联合。
我对此的理解正确吗?
显然,这将成为依赖的声明的实现XMFLOAT3。
我有一个看起来像这样的结构:
struct rtok {
char type;
std::string val;
bool term;
};
Run Code Online (Sandbox Code Playgroud)
我正在编写一个简单的解释器,这个"rtok"结构就是我如何表示一个标记.我有一个"rtoks"向量,我迭代生成解析树.
我的问题是,如果我的结构中有3个成员而我只给1个成员一个值,那么其他成员是否还会占用内存?
我的意思是,如果我将"val"设置为"test",我的令牌只占用4个字节,还是会占用6个字节?("val"为4个字节,类型为1个字节,术语为1个字节)