Questions tagged «memory-alignment»

8
内存对齐的目的
诚然我不明白。假设您有一个存储器,其存储器字的长度为1个字节。为什么不能在未对齐地址(即不能被4整除)的单次存储器访问中访问4字节长的变量,因为对齐地址就是这种情况?


4
为什么结构对齐取决于字段类型是基本类型还是用户定义的?
在Noda Time v2中,我们正在向纳秒级分辨率发展。这意味着我们不能再使用8字节整数来表示我们感兴趣的整个时间范围。这促使我研究了Noda Time的(许多)结构的内存使用情况,这反过来又导致了我在CLR的一致性决定中发现一点奇怪之处。 首先,我意识到这是一个实现决策,并且默认行为可以随时更改。我意识到我可以使用[StructLayout]和对其进行修改[FieldOffset],但我想提出一个解决方案,该方案在可能的情况下不需要。 我的核心场景是,我的struct包含一个引用类型字段和两个其他值类型字段,其中这些字段是的简单包装int。我曾希望在64位CLR上将其表示为16个字节(参考为8个字节,其他每个为4个字节),但是由于某种原因,它使用了24个字节。顺便说一句,我正在使用数组来测量空间-我知道布局在不同情况下可能会有所不同,但这感觉是一个合理的起点。 这是演示该问题的示例程序: using System; using System.Runtime.InteropServices; #pragma warning disable 0169 struct Int32Wrapper { int x; } struct TwoInt32s { int x, y; } struct TwoInt32Wrappers { Int32Wrapper x, y; } struct RefAndTwoInt32s { string text; int x, y; } struct RefAndTwoInt32Wrappers { string text; Int32Wrapper …

4
堆栈变量是否由GCC __attribute __((aligned(x)))对齐?
我有以下代码: #include <stdio.h> int main(void) { float a[4] __attribute__((aligned(0x1000))) = {1.0, 2.0, 3.0, 4.0}; printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]); } 我有以下输出: 0x7fffbfcd2da0 0x7fffbfcd2da4 0x7fffbfcd2da8 0x7fffbfcd2dac 为什么地址a[0]不是的倍数0x1000? 到底__attribute__((aligned(x)))是什么?我误解了这个解释吗? 我正在使用gcc 4.1.2。

4
内存对齐:如何使用alignof / alignas?
我现在正在使用共享内存。 我无法理解alignof和alignas。 cppreference不清楚:alignof返回“ alignment”,但是什么是“ alignment”?要为下一个要对齐的块添加的字节数?填充尺寸?堆栈溢出/博客条目也不清楚。 有人能解释清楚alignof和alignas?

4
在C ++ 11中对齐内存的推荐方法是什么
我正在研究单生产者单消费者环形缓冲区实现,我有两个要求: 将单个分配的环形缓冲区实例与缓存行对齐。 将环形缓冲区中的字段与高速缓存行对齐(以防止错误共享)。 我的课看起来像这样: #define CACHE_LINE_SIZE 64 // To be used later. template<typename T, uint64_t num_events> class RingBuffer { // This needs to be aligned to a cache line. public: .... private: std::atomic<int64_t> publisher_sequence_ ; int64_t cached_consumer_sequence_; T* events_; std::atomic<int64_t> consumer_sequence_; // This needs to be aligned to a cache …

2
为什么argc和argv的地址相隔12个字节?
我在计算机(运行Linux的64位Intel)上运行了以下程序。 #include <stdio.h> void test(int argc, char **argv) { printf("[test] Argc Pointer: %p\n", &argc); printf("[test] Argv Pointer: %p\n", &argv); } int main(int argc, char **argv) { printf("Argc Pointer: %p\n", &argc); printf("Argv Pointer: %p\n", &argv); printf("Size of &argc: %lu\n", sizeof (&argc)); printf("Size of &argv: %lu\n", sizeof (&argv)); test(argc, argv); return 0; …

1
使std :: vector分配内存的现代方法
在以下问题是相关的,但答案是旧的,并且从用户评论马克Glisse表明有因为C ++ 17的新方法这个问题可能没有得到充分讨论。 我正在尝试使对齐的内存对于SIMD正常工作,同时仍然可以访问所有数据。 在Intel上,如果创建类型为float的向量__m256,并将大小减小8倍,则会使内存对齐。 例如 std::vector<__m256> mvec_a((N*M)/8); 以一种有点怪异的方式,我可以将指向矢量元素的指针强制转换为float,这使我可以访问各个float值。 取而代之的是,我希望具有一个std::vector<float>正确对齐的,因此可以在__m256不进行段错误的情况下加载到其他SIMD类型中。 我一直在研究aligned_alloc。 这可以给我一个正确对齐的C样式数组: auto align_sz = static_cast<std::size_t> (32); float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float)); 但是我不确定如何执行此操作std::vector<float>。赋予std::vector<float>所有权marr_a 似乎是不可能的。 我已经看到一些建议,我应该编写一个自定义分配器,但这似乎需要大量工作,也许对于现代C ++,有更好的方法吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.