25得票1回答
GCC不能像C数组一样优化对齐的std :: array。

这是一段使用std::array时,GCC 6和7无法进行优化的代码:#include <array> static constexpr size_t my_elements = 8; class Foo { public: #ifdef C_ARRAY typedef...

24得票3回答
如何在C语言中分配和释放对齐内存

如何在C语言中分配内存并将其对齐到特定边界(例如,缓存行边界)?我正在寻找类似于malloc/free的实现,最好尽可能具有可移植性-至少在32位和64位架构之间。 编辑以添加:换句话说,我正在寻找类似于(现在已过时?)memalign函数的东西,它可以使用free释放。

22得票1回答
C11的alignas与clang -Wcast-align的区别

我有一段最小化的C11代码,定义了一个包含uint16_t的结构体(这意味着应该将该结构体对齐到2字节),我想将char缓冲区转换为指向该结构体的指针。 开启所有警告后,clang正确地抱怨结构体的对齐要求未满足。因此,我添加了C11 alignas说明符以确保缓冲区足够对齐,但这并没有让cl...

22得票2回答
为什么同一个程序中相同的C循环代码副本执行时间差异显著且保持一致?

我希望您能够将我的问题简化为一个简单且可重现的测试用例。源代码(可以在这里找到)包含了10个相同的简单循环。每个循环的形式如下: #define COUNT (1000 * 1000 * 1000) volatile uint64_t counter = 0; void loopN(voi...

22得票4回答
为什么32位和64位系统上的“对齐方式”相同?

我在思考编译器是否会在32位和64位系统上使用不同的填充,因此我在一个简单的VS2019 C++控制台项目中编写了下面的代码:struct Z { char s; __int64 i; }; int main() { std::cout << sizeof...

22得票1回答
为什么在C11中没有对齐的calloc函数

C11标准添加了aligned_alloc函数,用于分配未初始化的对齐内存。标准还包括calloc函数,用于分配已初始化为零但仅将其对齐到最大类型大小的内存。 为什么C11标准没有包含一个aligned_calloc函数,该函数分配对齐的零初始化内存? 我知道您可以使用memset对结果进...

22得票3回答
如何解决AVX加载/存储操作的32字节对齐问题?

我在使用ymm寄存器时遇到了对齐问题,代码片段看起来对我来说似乎很好。这里是一个最小的工作示例:#include <iostream> #include <immintrin.h> inline void ones(float *a) { __m256 o...

21得票2回答
现代化方法制作std::vector分配对齐内存

此问题有关,但回答已经过时,用户Marc Glisse的评论表明自C++17以来有新方法可以解决这个问题,可能尚未充分讨论。 我正在尝试使SIMD适配器正常工作,同时仍然可以访问所有数据。 在Intel上,如果我创建一个类型为__m256的float向量,并将我的大小减少8倍,它会给我对齐...

20得票3回答
`std::alignment_of` 与 `alignof` 的区别

我刚刚偶然发现了 std::alignment_of 类型特性及其即将推出的朋友std::alignment_of_v。它们似乎专门设计成等效于普通调用alignof,而_v助手的未来添加表明这不仅仅是一个遗留的位。 当我们有alignof时,std::alignment_of(_v)有什么用处?

20得票2回答
为什么类的大小取决于成员声明的顺序?如何实现的?

有人能解释一下类中成员声明的顺序如何决定该类的大小吗? 例如:class temp { public: int i; short s; char c; }; 上述类的大小为 8 字节。但是当成员声明顺序如下更改时class temp { public: char...