C++ 11引入了alignas说明符来指定变量的对齐方式,以及alignof运算符来查询类型的默认对齐方式.但是,我没有看到任何方法来获得特定变量的对齐方式.让我们采取以下简单的例子:
alignas(16) float* array;
Run Code Online (Sandbox Code Playgroud)
以下是我们可以做的事情:
alignof(float*) 返回8,这显然不是我们想要的.alignof(array)返回16,这正是我们想要的,但这是一个编译器扩展; alignof由标准指定不能用于特定变量.alignof(decltype(array)) 返回8,这是非常期待但不是我们想要的.std::alignment_of是实施的alignof,所以它没有多大帮助.我想要一种机制来确认特定变量array是否在16字节边界上对齐.标准中是否有任何内容可以执行此类查询?
请考虑以下代码:
int square(volatile int *p)
{
return *p * *p;
}
Run Code Online (Sandbox Code Playgroud)
现在,volatile关键字指示在存储器中的单元的值可以在方式未知(经由信号中断,硬件寄存器或存储器映射I/O例如修改)被改变以在编译程序或具有其他未知的副作用,即使没有在程序代码修改内容.
那么当我们将指针声明为volatile时会发生什么?
上面提到的代码是否总是有效,或者与此有什么不同:
int square(volatile int *p)
{
int a = *p;
int b = *p
return a*b;
}
Run Code Online (Sandbox Code Playgroud)
我们可以最终乘以不同的数字,因为指针是易变的吗?
或者有更好的方法吗?
C11 6.7.3类型限定词,第7段,内容如下:
具有volatile限定类型的对象可能以实现未知的方式进行修改,或者具有其他未知的副作用.因此,任何涉及这种对象的表达都应严格按照抽象机的规则进行评估,如5.1.2.3所述.
在以下示例中,第三行中访问的对象是否受上述规则约束?
int x;
volatile int *p = &x;
*p = 42;
Run Code Online (Sandbox Code Playgroud)
换句话说,左值*p是否具有类型volatile int意味着正在访问易失性对象,或者p指向非易失性对象的事实是否x意味着编译器可以利用这些知识进行优化并省略易失性访问?
由于它可能是有意义的,我感兴趣的特定用例不在普通C的范围内; 它涉及使用pre-C11结构(可以是内联asm或简称为黑盒子)进行线程同步的原子,用于原子比较和交换,具有以下习语:
do {
tmp = *p;
new = f(tmp);
} while (atomic_cas(p, tmp, new) != success);
Run Code Online (Sandbox Code Playgroud)
在这里,指针p就会有型volatile int *,但我很担心会发生什么,当实际指向的对象是非易失性的,特别是是否编译器可以单址变换,以*p从tmp = *p为以下形式的两次存取:
do {
new = f(*p);
} while (atomic_cas(p, *p, new) != success);
Run Code Online (Sandbox Code Playgroud)
这显然会使代码不正确.因此,目标是确定是否所有这些指向的对象实际上都需要volatile int.
什么是extern volatile指针.
extern volatile uint32 *ptr;
Run Code Online (Sandbox Code Playgroud)
在这里,*ptr的行为是什么?这究竟意味着什么?
而且,什么时候应该使用?
我试图谷歌,但没有得到任何满意的答案,关于这个组合没有太多的信息.
如您所知,如果稍后不访问memset()内存,我们不能将其用于清零,因为它可能会被编译器优化。我看到了一个建议,在CPP参考,我们可以用一个指针来解决这个问题。现在这是我的问题:std::fillvolatile
volatile,std::fill也可以优化?vector?这样的东西有用吗?vector<int> v;
volatile auto ptr = v.data();
Run Code Online (Sandbox Code Playgroud) 我正在编译一些没有优化的代码但是在启用优化的情况下中断.我怀疑代码的某些关键部分被优化了,导致逻辑崩溃.
我想做的事情如下:
code...
#disable opt
more code...
#enable opt
Run Code Online (Sandbox Code Playgroud)
如果我可以设置该部分的优化级别(如O0,O1 ......)会更好
对于那些暗示它是代码的人:
要删除的代码部分是(通过反汇编目标文件来检查):
void wait(uint32_t time)
{
while (time > 0) {
time--;
}
}
Run Code Online (Sandbox Code Playgroud)
我严重怀疑该代码有问题