草庐IT

c++ - 指向对齐内存的指针

我经常使用基于编译器的矢量化,例如用于AVX。我试图通过依赖C++11对齐功能来提出一种更简洁的方法,而不依赖于基于编译器的扩展(例如英特尔的#pragmavectoraligned)。如果您考虑下面的代码,例如aligned::arraymy_array;允许我在堆栈中声明一个正确对齐的数组,如果它在同一个翻译单元中使用,编译器似乎可以识别这一点。我的问题现在涉及如何声明具有对齐参数的函数。我最成功的尝试是,例如aligned::ptr,用于函数f()下面。gcc在没有警告的情况下编译它(使用-std=c++0x-O3),并且循环被矢量化。英特尔icc但是,会发出警告并且无法正确矢量

c++ - 指向对齐内存的指针

我经常使用基于编译器的矢量化,例如用于AVX。我试图通过依赖C++11对齐功能来提出一种更简洁的方法,而不依赖于基于编译器的扩展(例如英特尔的#pragmavectoraligned)。如果您考虑下面的代码,例如aligned::arraymy_array;允许我在堆栈中声明一个正确对齐的数组,如果它在同一个翻译单元中使用,编译器似乎可以识别这一点。我的问题现在涉及如何声明具有对齐参数的函数。我最成功的尝试是,例如aligned::ptr,用于函数f()下面。gcc在没有警告的情况下编译它(使用-std=c++0x-O3),并且循环被矢量化。英特尔icc但是,会发出警告并且无法正确矢量

c++ - 为什么 alignas() 不采用参数包?

根据cppreference.com对齐说明符(C++11起)指定类型或对象的对齐要求。语法alignas(表达式)alignas(type-id)alignas(pack...)alignas(expression)必须是整数常量表达式,其计算结果为零,或者为对齐或扩展对齐的有效值。等同于alignas(alignof(type))等价于应用于同一个声明的多个alignas说明符,一个用于参数包的每个成员,可以是类型或非类型参数包。那么为什么下面的代码不适用于g++、clang或VC++?structalignas(1,4)A{};或structalignas(int,double)

C++ 对齐(何时使用 alignas)

我最近了解了结构的大小和对齐方式。我非常熟悉alignas()说明符的使用方法和工作原理。我已经看到了正确使用的例子(关于语义,而不是现实生活中的用例)以及它改变类型/变量大小的方式。但是,我不知道什么时候它在我的代码中有用。当开发人员应手动指定数据对齐方式时,您能否列出一些用例? 最佳答案 有很多用例表明alignas在对延迟敏感的多线程应用程序中很方便。例如。高频交易应用。Alignas可以更严格地控​​制对象在CPU缓存上的布局方式,从而更快地访问对象。最佳使用目标如下,即使用alignas的用例您想避免缓存行中的数据不必要地

c++ - 与 alignas 语法作斗争

我正在尝试使用alignas作为类成员的指针,坦率地说,我不确定我应该把它放在哪里。例如:classA{private:intn;alignas(64)double*ptr;public:A(constintnum):n(num),ptr(newdouble[num]){}};我希望这将确保ptr的数据在64字节block上对齐。使用英特尔编译器,它不会。谁能指出我正确的方向? 最佳答案 在类的成员上使用alignas(N)关键字会导致此成员根据指定的对齐方式而不是任何可能指向的实体进行对齐。毕竟,当用值初始化指针时,无法控制对齐已

c++ - alignas 说明符 vs __attribute__(aligned),c++11

我目前正在使用C++11开发操作系统内核,我遇到了一个问题,我似乎无法找到自己的答案。目前我正在对齐我的分页结构,使用编译器特定的属性(例如gcc的__attribute__(aligned)),但是我想改用C++11alignas说明符,在Clang++这不是问题,因为它很乐意接受4096对齐作为alignas的参数,但是G++不接受!所以首先,alignasspecifier和gcc__attribute__(aligned)之间的主要区别是什么,显然两者都确保与特定值对齐,但是gcc中的alignas说明符似乎有128的限制,而属性似乎几乎没有限制,这是为什么?另外,为什么不能将

c++ - 如何模拟 alignas(T)?

我有一个数组,用作T类型对象的底层内存:charmemory[sizeofT];...new(memory)T(whatever);如何确保memory与T对象正确对齐?在C++0x中我只能说:alignas(T)charmemory[sizeofT];但VisualStudio2010尚不支持该特定功能。 最佳答案 通常的(可移植的)解决方案是将内存声明与T中的任何内置类型放在一个union中。最需要对齐。最简单的方法是使用与所有可能的union候选人:unionMaxAlign{inti;longl;longlongll;lon

c++ - 内存对齐 : how to use alignof/alignas?

我现在使用共享内存。我无法理解alignof和alignas。cppreference不清楚:alignof返回“对齐”,但什么是“对齐”?为要对齐的下一个block添加的字节数?填充尺寸?Stackoverflow/博客条目也不清楚。谁能解释清楚alignof和alignas? 最佳答案 对齐是对可以存储值的第一个字节的内存位置的限制。(需要提高处理器的性能并允许使用某些指令,这些指令仅适用于具有特定对齐方式的数据,例如SSE需要对齐到16字节,而AVX需要对齐到32字节。)16对齐意味着只有16的倍数的内存地址是唯一有效的地址。

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

为了标准化我的代码并使其更便携,我替换了#ifdef__GNUC__typedef__attribute__((aligned(16)))floataligned_block[4];#elsetypedef__declspec(align(16))floataligned_block[4];#endif与typedeffloatalignas(16)aligned_block[4];在C++11中。但是,gnu(4.8)不喜欢这样,而是提示test.cc:3:9:warning:attributeignored[-Wattributes]typedeffloatalignas(16)a

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

为了标准化我的代码并使其更便携,我替换了#ifdef__GNUC__typedef__attribute__((aligned(16)))floataligned_block[4];#elsetypedef__declspec(align(16))floataligned_block[4];#endif与typedeffloatalignas(16)aligned_block[4];在C++11中。但是,gnu(4.8)不喜欢这样,而是提示test.cc:3:9:warning:attributeignored[-Wattributes]typedeffloatalignas(16)a