首页 > TAG信息列表 > memory-alignment

c-如何使用alignof强制对齐堆分配?

我想强制特定的堆分配返回64字节对齐的地址,因为这是缓存行边界.我以为我可以这样 int *p = new alignas(64) int; 但我的编译器似乎都不给p一个64的倍数的地址.这是我要检查的方式: #include <iostream> int main() { int *p = new alignas(64) int; std::cout << long(p)

c-命名数组元素或联合中的结构和数组

考虑以下结构: struct Vector4D { union { double components[4]; struct { double x, y, z, t; } Endpoint; }; }; 在我看来,我在WinApi的IPAddress结构中看到了类似的内容.这个想法是让我可以同时使用索引和名称来使用数组组件,例如: Vector4D v; v.compon

带有“空类”的C多重继承内存布局

我知道多继承的内存布局没有定义,所以我不应该依赖它.但是,我可以在特殊情况下依赖它.也就是说,一个班级只有一个“真正的”超级班级.所有其他的都是“空类”,即既没有字段也没有虚拟方法的类(即它们只有非虚方法).在这种情况下,这些附加类不应该向类的内存布局添加任何内容. (更简

linux – 32位x86程序集中堆栈对齐的责任

我试图清楚地了解谁(调用者或被调用者)负责堆栈对齐. 64位汇编的情况相当清楚,它来自调用者. 参考System V AMD64 ABI,第3.2.2节“堆栈帧”: The end of the input argument area shall be aligned on a 16 (32, if __m256 is passed on stack) byte boundary. 换句话说,应该

c – 对于所有对象类型T,sizeof(T)> = alignof(T)总是这样吗?

对于任何对象类型T,总是这样的情况,sizeof(T)至少与alignof(T)一样大吗? 直观地看起来如此,因为即使你调整对象的对齐方式,例如: struct small { char c; }; 通常情况下,它们的“大小”也会向上调整,以便在保持对齐的同时,阵列中对象之间的关系是有意义的(至少在我的testing中.例

C容器的非交错存储元组

我正在寻找std :: vector或std :: array of tuples的变体,其中元组元素被非交错放置到单独的内存区域而不是交错,例如,std ::矢量<标准::元组&LT ...&GT取代. 对此的动机是 >更好地控制对齐,从而提高矢量优化的性能.>当在OpenGL中连接低级CPU-GPU数据传输操作(例如顶点和颜色数

c – __declspec(align)用于多个声明

很抱歉这个非常简单的问题,找不到谷歌回答. 这是声明语法: __declspec(align(16)) float rF[4]; __declspec(align(16)) float gF[4]; __declspec(align(16)) float bF[4]; 相当于: __declspec(align(16)) float rF[4], gF[4], bF[4]; 或者只有第一个变量在后一种语法中对齐? 如果

c – 为什么打包对象的sizeof低于预期?

我有以下代码: #pragma pack(push, 4) class C { public: char a; char b; short c; char d; }; C e; 我不明白为什么sizeof(e)是6. 我认为sizeof(e)将是8 => 1(a)1(b)2(c)1(d)3(用于校准)解决方法:Packing指令设置对齐的上限,而不是最小值.

c – 从任何内存地址读取UInt32的最有效方法?

从C中的任意内存地址读取UInt32值的最有效方法是什么? (假设Windows x86或Windows x64架构.) 例如,考虑使用一个指向内存中某处的字节指针来阻止包含整数,字符串数据等的组合,这些组合都混合在一起.以下示例显示了在循环中从此块读取各个字段. typedef unsigned char* BytePtr; typ

c – 尝试将std :: aligned_storage与SSE和new一起使用

我想尝试使用C中的SSE instrincs来获取一些浮点数的平方根.但是当我尝试存储结果时,我得到一个例外.我可以像这样使用std :: aligned_storage吗? #include <iostream> #include <type_traits> #include <xmmintrin.h> using namespace std; using float_storage = aligned_storage

c – 混淆数据地址对齐

我对提供的答案有疑问 @ dan04. What is aligned memory allocation? 特别是,如果我有这样的事情: int main(){ int num; // 4byte char s; // 1byte int *ptr; } 如果我有一台32位机器,你认为默认情况下它仍会填充数据吗? 在上一个问题中,有人问过struct,

结构w /位字段:CPython和C填充不同

考虑以下程序: #include <stddef.h> #include <stdio.h> typedef struct { unsigned bit:1; unsigned char str[8]; } test; #pragma pack(1) typedef struct { unsigned bit:1; unsigned char str[8]; } test_pack; int main(in

c – 如何确保成员是4字节对齐的?

为了使用OSAtomicDecrement(特定于mac的原子操作),我需要提供一个4字节对齐的SInt32. 这种烹饪有用吗?有没有其他方法来处理对齐问题? struct SomeClass { SomeClass() { member_ = &storage_ + ((4 - (&storage_ % 4)) % 4); *member_ = 0; } SInt32 *member_;

c – 如何从堆中为InterlockedIncrement函数分配正确的内存对齐?

这段代码似乎有用,但我是否正确使用了InterlockedIncrement函数? m_count的正确内存对齐是我主要关心的问题.假设我们在x86-64系统上并编译一个64位应用程序(如果重要的话).顺便说一句,为了我的实际目的,我不能将m_count声明为volatile long,然后使用InterlockedIncrement(& m_count

Linux中的结构分配在ARM中失败但在x86中成功

我注意到一些非常奇怪的东西. 说我已经定义了以下结构 typedef struct { uint32_t a; uint16_t b; uint32_t c; } foo; 这个结构包含在我从网络接收的大缓冲区中. 以下代码适用于x86,但我在ARM上收到SIGBUS. extern void * buffer; foo my_foo; my_foo = (( foo * ) buffe

Python ctypes对齐数据结构

我有一个C库,它被编译成一个共享对象,并希望围绕它构建一个ctypes接口,从Python调用C函数. 一般来说它工作正常,但在C库中有一个双数组的定义: typedef double __attribute__ ((aligned (32))) double_array[512]; 我发现无法直接访问此类型,所以我在Python中定义: DoubleArray =