观察更改的全局变量/布尔表达式

时间:2015-12-04 11:31:25

标签: c++ assembly

我想知道当一些布尔表达式变为真时我怎么能做某事。我不能使用简单的if,因为我希望它检查bools表达式何时在代码的任何部分发生变化,如果是真的则进行检查。

这将是这样的:

when(int x != 0)
{
  cout << "x";
}

它可以使用Assembly,性能越好越好。

4 个答案:

答案 0 :(得分:2)

  

我想知道当一些布尔表达式为真时我怎么能做某事

这正是if所做的。

  

我希望它检查bools表达式在代码的任何部分发生变化时

每次分配变量时,只需使用if

当然,如果在分配变量后总是进行相同的检查,并且如果检查为真则执行相同的操作,那么您显然会重复。如果要多次重复执行相同的操作,可以使用函数来避免重复代码。只是不要直接修改变量而不是调用该函数。

这是一个函数示例,它在内存中分配变量并根据布尔表达式执行分支。如果true,则打印变量:

                    .cfi_startproc
                    @ args = 0, pretend = 0, frame = 8
                    @ frame_needed = 1, uses_anonymous_args = 0
0000 00482DE9       stmfd   sp!, {fp, lr}
                    .save {fp, lr}

                .LCFI0:

                    .cfi_def_cfa_offset 8
                    .cfi_offset 11, -8
                    .cfi_offset 14, -4
                    .setfp fp, sp, #4
0004 04B08DE2       add fp, sp, #4

                .LCFI1:

                    .cfi_def_cfa 11, 4
                    .pad #8
0008 08D04DE2       sub sp, sp, #8
000c 08000BE5       str r0, [fp, #-8]

0010 30309FE5       ldr r3, .L3
0014 08201BE5       ldr r2, [fp, #-8]
0018 002083E5       str r2, [r3, #0]

001c 24309FE5       ldr r3, .L3
0020 003093E5       ldr r3, [r3, #0]
0024 000053E3       cmp r3, #0
0028 0400001A       bne .L1           ; <-- the branch is here

002c 14309FE5       ldr r3, .L3
0030 003093E5       ldr r3, [r3, #0]
0034 10009FE5       ldr r0, .L3+4
0038 0310A0E1       mov r1, r3
003c FEFFFFEB       bl  printf

                .L1:

0040 04D04BE2       sub sp, fp, #4
0044 0088BDE8       ldmfd   sp!, {fp, pc}

                .L4:

                    .align  2

                .L3:

0048 00000000       .word   global
004c 00000000       .word   .LC0
                    .cfi_endproc

答案 1 :(得分:2)

如果这是用于调试,请在调试器的x上设置数据断点或观察点。

如果没有,那么你正在使用C ++,因此你可以将x包装在一个重载赋值运算符的类中以打印更改。重载operator const &int()以允许foo = x + 4之类的内容,而无需foo = x.get_value() + 4

#include <iostream>

template <typename T>
class value_changelogger
{
  private:
    T m_val;
  public:
    T& operator=(T newval) {
      if (newval != m_val)
        std::cout << newval << std::endl;
      return m_val = newval;
    }
    operator const T&() { return m_val; }  // only allow const-references to escape our watchful eye
};

value_changelogger<int> x;

int main(int, char**)
{
    x = 4;
    int y = x + 4;
    x = y;
    // x++;  doesn't compile: no operator++ overload, and non-const operator T&() isn't overloaded.
}

wandbox link

如果没有实际拥有所有修改操作符的代码,

C++11 explicit operator T&似乎没有帮助进行更改检测。

所以我认为你必须单独重载所有可以修改值的运算符,以使其完全透明。

请注意,这只是在if ()检查中添加的语法糖,无处不在x它不会使机器代码更有效率,而不是像你必须在C中那样手动完成它。

答案 2 :(得分:1)

使用C ++不能直接实现这一点,因为所有语句都是按顺序执行的。没有&#34; C ++数据断点&#34;,就像调试器提供它一样。

假设您不想更改变量更改的所有位置,您可以获得的最接近的是创建第二个线程,该线程重复检查布尔条件,并在满足条件时执行操作。但是在条件改变后,动作永远不会立即执行,总会有短暂的延迟。

答案 3 :(得分:0)

您可以使用:

int _x;
inline int get_X(){return _x;}
inline int set_X(int value){
    _x = value;
    //dosomething
    return _x;
}

然后代替在代码中编写x = bla,写下set_X(bla)