20
|
Stack Overflow is garbage · 技术社区 · 15 年前 |
![]() |
1
15
在C++11中,头cstddef中定义的std::max_align_t是一种POD类型,其对齐要求至少与每个标量类型的对齐要求一样严格(一样大)。
使用新的alignof操作符,它将非常简单
|
![]() |
2
11
在C++0x中
尚不清楚SSE类型是否会被视为“C++对象类型”
默认参数不是TR1的一部分
|
![]() |
3
7
不幸的是,确保最大对齐比应该的要困难得多,而且AFAIK没有保证的解决方案。从 GotW 博客( Fast Pimpl article ):
这是我所知道的最接近的“黑客”了。
我用它来 Pimpls 尤其然而,仅仅拥有分配器是不够的;为了让这样的分配器工作,我们必须假设类Foo的内存是在构造函数中分配的,同样的内存也只在析构函数中释放,而Foo本身是在堆栈上创建的。为了安全起见,我需要一个函数来查看类的“this”指针是否在本地堆栈上,以确定是否可以使用基于堆的超快速堆栈分配器。为此,我们必须研究特定于操作系统的解决方案:我使用 TIBs 和 TEBs 对于Win32/Win64,我和我的同事找到了Linux和Mac OS X的解决方案。 在研究了一周特定于操作系统的方法来检测堆栈范围、对齐要求,并进行了大量测试和分析之后,结果是一个分配器,它可以根据我们的滴答计数器基准在4个时钟周期内分配内存,而malloc/operator new的分配周期约为400个(我们的测试涉及线程争用,因此在单线程情况下,malloc可能会比这快一点,可能需要几百个周期)。我们添加了一个每线程堆堆栈,并检测到正在使用哪个线程,这将时间增加到了大约12个周期,尽管客户端可以跟踪线程分配器以获得4个周期的分配。这消除了映射中基于内存分配的热点。
虽然您不必经历所有这些麻烦,但编写一个快速分配器可能比类似的东西更容易,也更普遍适用(例如:允许在运行时确定分配/取消分配的内存量)
|
![]() |
4
5
缺少一些
|
![]() |
5
1
分配对齐内存比看起来要复杂-例如,请参阅 Implementation of aligned memory allocation |
![]() |
6
-2
这就是我用的。除此之外,如果您正在分配内存,那么长度大于或等于max_alignment的新()d字符数组将与max_alignment对齐,这样您就可以使用该数组中的索引来获得对齐的地址。
|
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |