我想知道当一些布尔表达式变为真时我怎么能做某事。我不能使用简单的if
,因为我希望它检查bools表达式何时在代码的任何部分发生变化,如果是真的则进行检查。
这将是这样的:
when(int x != 0)
{
cout << "x";
}
它可以使用Assembly,性能越好越好。
答案 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.
}
如果没有实际拥有所有修改操作符的代码,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)
。