相关疑难解决方法(0)

C++中的struct padding

如果我有一个structC++,有没有办法安全地读/写一个跨平台/编译器兼容的文件?

因为如果我理解正确,每个编译器"填充"基于目标平台不同.

c++ struct

51
推荐指数
3
解决办法
5万
查看次数

我在哪里可以在C++ 11中使用alignas()?

为了使我的代码标准化并使其更具可移植性,我更换了

#ifdef __GNUC__
typedef __attribute__((aligned(16))) float aligned_block[4];
#else
typedef __declspec(align(16)) float aligned_block[4];
#endif
Run Code Online (Sandbox Code Playgroud)

typedef float alignas(16) aligned_block[4];
Run Code Online (Sandbox Code Playgroud)

在C++ 11中.然而,gnu(4.8)并不喜欢这样但是抱怨

test.cc:3:9: warning: attribute ignored [-Wattributes]
  typedef float alignas(16) aligned_block[4];
                ^
test.cc:3:9: note: an attribute that appertains to a type-specifier is ignored
Run Code Online (Sandbox Code Playgroud)

而clang 3.2没有发出警告(即使有-Weverything -Wno-c++98-compat -pedantic).所以我想知道我上面的代码是否正确,更一般地说,我alignas()可以在哪里放置.

编辑(2013年4月):

该标准的相关文章是7.6.2,特别是7.6.2.1

对齐说明符可以应用于变量或类数据成员,但不应该应用于位字段,函数参数,catch子句的形式参数(15.3)或使用注册存储类说明符.对齐说明符也可以应用于类或枚举类型的声明.带省略号的对齐说明符是包扩展(14.5.3).

正如Red XIII已经挖出来的那样.但是,我不够专业,不知道这对我上面的测试意味着什么.

如果clang接受我的属性这一事实意味着什么,那么也许值得一提的是,当试图使用using指令代替a时typedef,clang也会抱怨.此外,与此问题的早期版本中的陈述相反,gcc不仅警告,而且实际上忽略了我对齐的愿望.

c++ alignment c++11 alignas

32
推荐指数
3
解决办法
1万
查看次数

alignas和alignof关键字用于什么?

我无法理解alignasalignof关键字的用途是什么,我不太确定我完全理解对齐是什么.

据我所知,如果内存地址可被n整除,则它与n个字节对齐,也就是说,它可以通过一次计数'n'个字节(从0?或某个默认值?)来获得.此外,alignas关键字在为变量声明添加前缀时,指定如何对齐存储alignof变量的地址,以及返回变量地址的对齐方式.

但是,我不相信这是对齐或alignof/ alignas关键字的正确理解- 请在我错误的任何一点纠正我.我也没有看到这些关键字的用途,所以如果有人能指出他们的目的是什么,我将不胜感激.

alignment c++11

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

在32位平台上的结构中对齐

在为32位x86 linux运行以下代码时,我得到了意想不到的结果(编译器标志:g ++ -std = c ++ 14 -m32).我试过gcc和clang.

#include <iostream>
using namespace std;

struct S1
{
  uint64_t a;
  uint32_t b;
};

struct S2
{
  alignas(uint64_t) char a[8];
  uint32_t b;
};

int main()
{
  cout << "sizeof(S1)=" << sizeof(S1) << endl;
  cout << "sizeof(S2)=" << sizeof(S2) << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

sizeof(S1)=12
sizeof(S2)=16
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?为什么S1和S2的尺寸不同?据我了解,64位整数值在32位x86机器上与32位对齐.这解释了为什么S1的大小是12个字节.但为什么这不适用于S2呢?

c++ padding alignas

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

GLM 数学库是否与 Apple 的金属着色语言兼容?

我准备将一个使用 C++ 编写的 OpenGL 的 iOS 应用移植到 Apple 的 Metal 中。目标是完全摆脱 OpenGL 并用 Metal 取而代之。

OpenGL 代码是分层的,我试图只替换渲染器,即实际调用 OpenGL 函数的类。然而,整个代码库利用 GLM 数学库来表示向量和矩阵。

例如,有一个提供视图和投影矩阵的相机类。它们都是类型glm::mat4,并且只是传递给 GLSL 顶点着色器,在那里它们与mat4GLSL 给出的数据类型兼容。我想利用该相机类将这些矩阵发送到 Metal 顶点着色器。现在,我不确定是否glm::mat4与 Metal 兼容float4x4.

我没有一个可以测试这个的工作示例,因为我实际上只是从 Metal 开始并且在网上找不到任何有用的东西。

所以我的问题如下:

  1. 是GLM类型,如glm::mat4glm::vec4与金属的兼容float4x4/ float4
  2. 如果问题 1. 的答案是肯定的,如果我在 Metal 着色器中直接使用 GLM 类型,我有什么缺点吗?

关于问题 2. 的背景是我遇到了 Apple 的 SIMD 库,它提供了另一组数据类型,在这种情况下我无法使用,对吗?

该应用程序仅适用于 iOS,我根本不在乎在 macOS 上运行 Metal。

代码片段(最好是 Objective-C(是的,不是开玩笑))将非常受欢迎。

opengl objective-c ios glm-math metal

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

alignof 和 alignas C++ 关键字的实际用例

我刚刚了解alignofalignasC ++的关键字,但我不敢去想如果开发者希望使用这些关键字的任何实际的案例。

有人知道这些关键字的任何实际用例吗?

c++ memory-alignment memory-layout c++11

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

c ++ 12bit变量,我该怎么做?

我正在构建一个体素引擎,所以我担心内存使用情况,使用12位而不是16位块ID可以节省大量内存.我有一个块ID的3D数组,每个id都有一个静态配置.

我不确定实现这一目标的好方法是什么.有没有办法只获得一块原始内存并自己管理它,这是一个好主意; 我可能遇到任何问题吗?有一个更好的方法吗?

我对c ++有一些经验,但我的大部分时间都花在了Java和c#上.

谢谢阅读!

c++ memory-management voxel

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