相关疑难解决方法(0)

我可以在C++中安全地将浮点数结构转换为浮点数组吗?

例如,我有这个结构

struct  A {
    float x;
    float y;
    float z;
};
Run Code Online (Sandbox Code Playgroud)

我可以这样做吗?A a; float* array = (float*)&a; 并使用as float数组?

c++

30
推荐指数
4
解决办法
2640
查看次数

将double数组转换为double的结构

将双数组转换为由双精度构成的结构是否可以?

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)

c++ arrays struct static-cast language-lawyer

10
推荐指数
2
解决办法
840
查看次数

将结构转换为数组

这是一个严格的别名问题,因为编译器会因此引起任何优化顺序问题。

假设我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

c++ arrays alias struct reinterpret-cast

2
推荐指数
1
解决办法
1235
查看次数

C++ struct成员内存分配

我有一个看起来像这样的结构:

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个字节)

c++ memory struct interpreter

1
推荐指数
1
解决办法
2209
查看次数