欢迎所有平台,请指定您的答案平台.
一个类似的问题:如何以编程方式获取C++中的CPU缓存页面大小?
编辑:ST不允许为新手发布两个以上的链接.很抱歉找不到引用.
我正在尝试减少C应用程序中的锁定开销,其中检测全局状态的变化与性能相关.虽然我最近在这个主题上已经阅读了很多(例如H. Sutter的很多内容,还有更多)我对我的实现没有信心.我想结合使用类似CAS的操作和DCL来检查Cache-Line Aligned全局变量,从而避免错误共享,从多个线程之间共享的数据中更新线程本地数据.我缺乏信心主要是由于
我的问题:
Type-Attributes文档说明:
此属性指定指定类型的变量的最小对齐(以字节为单位).例如,声明:
(请参阅Type-Attributes文档以进行声明)
强制编译器确保(尽可能)每个变量的类型是
struct S或more_aligned_int将被分配并至少在8-byte边界上对齐.在SPARC上,将所有类型的变量struct S对齐到8-byte边界允许编译器在将struct S类型的一个变量复制到另一个变量时使用ldd和std(双字加载和存储)指令,从而提高运行时效率.
这是否意味着开始struct S或more_aligned_int将始终与8-byte边界对齐?这并不意味着数据将被填充以正好使用64个字节,对吗?
假设1.的确是每个实例struct cache_line_aligned(参见下面的代码示例1)在64-byte边界上对齐并且只使用一个缓存行(假设缓存行的64 bytes长度)
使用typedef该类型的声明不改变的语义__attribute__ ((aligned (64)))(见代码实施例2下面)
aligned_malloc如果使用struct声明struct,则在实例化struct时不需要使用__attribute__ ...
// Example 1
struct cache_line_aligned {
int version;
char …Run Code Online (Sandbox Code Playgroud) 我在查找有关GCC的对齐新警告和gcc -faligned-new选项的更多信息时遇到了一些困难.在gcc 7.2.0上编译(没有--std = c ++ 17)并尝试定义一个对齐的结构,例如:
struct alignas(64) Foo { int x; }
Run Code Online (Sandbox Code Playgroud)
做一个简单的旧:
Foo * f = new Foo();
Run Code Online (Sandbox Code Playgroud)
给我以下警告和建议:
alignas.cpp:36:25: warning: ‘new’ of type ‘Foo’ with extended alignment 64 [-Waligned-new=]
Foo * f = new Foo();
^
alignas.cpp:36:25: note: uses ‘void* operator new(long unsigned int)’, which does not have an alignment parameter
alignas.cpp:36:25: note: use ‘-faligned-new’ to enable C++17 over-aligned new support
Run Code Online (Sandbox Code Playgroud)
据我所知,默认情况下new只返回内存对齐alignof( std::max_align_t )(对我而言是16),但我不清楚的是,如果我传递-faligned-new,gcc现在会new代表我强制执行新的对齐吗?
不幸的是,关于这个的gcc文档非常缺乏.