相关疑难解决方法(0)

查询特定变量的对齐方式

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字节边界上对齐.标准中是否有任何内容可以执行此类查询?

c++ memory-alignment c++11

34
推荐指数
2
解决办法
1365
查看次数

指针可以变化吗?

请考虑以下代码:

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)

我们可以最终乘以不同的数字,因为指针是易变的吗?

或者有更好的方法吗?

c++ pointers volatile

21
推荐指数
2
解决办法
8337
查看次数

指针指向非易失性对象的指针行为的要求

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 *,但我很担心会发生什么,当实际指向的对象是非易失性的,特别是是否编译器可以单址变换,以*ptmp = *p为以下形式的两次存取:

do {
    new = f(*p);
} while (atomic_cas(p, *p, new) != success);
Run Code Online (Sandbox Code Playgroud)

这显然会使代码不正确.因此,目标是确定是否所有这些指向的对象实际上都需要volatile int.

c volatile language-lawyer

11
推荐指数
1
解决办法
487
查看次数

什么是extern volatile指针

什么是extern volatile指针.

extern volatile uint32 *ptr;
Run Code Online (Sandbox Code Playgroud)

在这里,*ptr的行为是什么?这究竟意味着什么?

而且,什么时候应该使用?

我试图谷歌,但没有得到任何满意的答案,关于这个组合没有太多的信息.

c volatile

10
推荐指数
1
解决办法
2万
查看次数

没有优化的清零内存

如您所知,如果稍后不访问memset()内存,我们不能将其用于清零,因为它可能会被编译器优化。我看到了一个建议,在CPP参考,我们可以用一个指针来解决这个问题。现在这是我的问题:std::fillvolatile

  1. 这个语句是否意味着如果指针不是volatilestd::fill也可以优化?
  2. 例如,我们如何获得指向容器的 volatile 指针vector?这样的东西有用吗?
vector<int> v;
volatile auto ptr = v.data();
Run Code Online (Sandbox Code Playgroud)

c++

5
推荐指数
1
解决办法
103
查看次数

是否可以为特定的代码段禁用gcc/g ++优化?

我正在编译一些没有优化的代码但是在启用优化的情况下中断.我怀疑代码的某些关键部分被优化了,导致逻辑崩溃.

我想做的事情如下:

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)

我严重怀疑该代码有问题

c optimization gcc

2
推荐指数
1
解决办法
611
查看次数