37得票3回答
查询特定变量的对齐方式

C++11引入了alignas指示符来指定变量的对齐方式,以及alignof操作符来查询特定类型的默认对齐方式。但是,我没有找到获取特定变量对齐方式的方法。让我们看下面这个简单的例子: alignas(16) float* array; 这是我们可以采取的措施: alignof(fl...

35得票4回答
为什么数据结构对齐对性能很重要?

有人可以给我一个简短而可信的解释,为什么编译器会添加填充以对齐数据结构中的成员?我知道这是为了使 CPU 更有效地访问数据,但我不明白为什么会这样。 如果这只涉及到 CPU,为什么在 Linux 中双倍精度值需要 4 字节对齐,在 Windows 中需要 8 字节对齐呢?

35得票1回答
Hinnant的堆栈分配器相关问题

我一直在使用Howard Hinnant的堆栈分配器,它非常好用,但是其中的一些实现细节对我来说有点不清楚。 为什么要使用全局操作符new和delete?allocate()和deallocate()成员函数分别使用::operator new和::operator delete。类似地,...

34得票8回答
C++中的原子性:神话还是现实

我在MSDN上读了一篇关于无锁编程的文章Lockless Programming。它说: 在所有现代处理器上,您可以假定自然对齐的本地类型的读写是原子的。只要内存总线至少与被读取或写入的类型一样宽,CPU 就会在单个总线事务中读取和写入这些类型,使其他线程无法看到它们处于半完成状态。 ...

34得票10回答
为什么Mac ABI要求x86-32的16字节栈对齐?

我理解对于旧的PPC RISC系统和x86-64,这个要求是可以理解的,但对于老牌的x86系统呢?在这种情况下,堆栈只需要按4字节边界对齐即可。是的,一些MMX/SSE指令需要16字节对齐,但如果调用方有此要求,则应确保对齐正确。为什么要给每个调用者加上这个额外的要求呢?这实际上可能会导致一些...

34得票2回答
利用ARM未对齐内存访问的优势,编写干净的C代码。

过去,ARM处理器无法正确处理未对齐的内存访问(ARMv5及以下版本)。如果ptr未在4字节上正确对齐,则类似于u32 var32 = *(u32*)ptr;的语句将失败(引发异常)。 对于x86 / x64,编写这样的语句将运行良好,因为这些CPU一直以来都非常有效地处理了这种情况。但根据...

32得票5回答
最佳跨平台方法获取对齐内存

这是我通常使用的用于在Visual Studio和GCC中获取对齐内存的代码inline void* aligned_malloc(size_t size, size_t align) { void *result; #ifdef _MSC_VER result = ...

30得票4回答
优化golang中数据结构/单词对齐填充

和我在C ++中学到的类似,我相信是填充导致了两个结构实例大小的差异。type Foo struct { w byte //1 byte x byte //1 byte y uint64 //8 bytes } type Bar struct { x byte ...

30得票3回答
成功的非对齐访问在x86上有什么实际影响?

我经常听说未对齐的存储访问会导致运行时错误,崩溃程序或减慢内存访问速度。然而,我找不到任何实际数据来说明它们会减缓多少程序运行速度。 假设我在x86上有一些(尚未知的)未对齐存储访问 - 实际上可能产生的最严重减速是多少,如何估计它,而又不消除所有未对齐存储访问,并比较两个版本代码的运行时间?

28得票4回答
当int64_t更改为int32_t时,为什么类大小会增加?

在我的第一个例子中,我使用了两个int64_t位域。当我编译并获取类的大小时,得到的大小为8。class Test { int64_t first : 40; int64_t second : 24; }; int main() { std::cout <&lt...