用于遵循C/C++代码
void fun(int* x)
{
//SOMECODE;//WITHOUT SAVING PREVIOUS VALUE
if(SOME CONDITION)
printf("VALUE OF X IS DIFFERENT THAN PREVIOUS CALL \n");
}
int main()
{
int a;
a=9;
fun(&a);
a=12;
fun(&a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是否有任何函数或标志值给我们提供有关变量是否变更的信息,如果有任何解决方案请回复
如果没有提供一些额外的代码来存储参数"中"的"最后"你的函数调用有一点机会都没有检测到,如果用相同的值或另一个叫.
由于x 的'当前'值将存在于堆栈中,只有在函数调用完成后它才会完全丢失.
在前期多线程时代只使用一个静态变量的函数的最后运行期间缓存x的值func可能(几乎)已经解决了你的问题:
void fun (int x) {
static int old_value = VALUE_INVALID;
if(x != old_value)
printf("VALUE OF X IS DIFFERENT THAN PREVIOUS CALL \n");
old_value = x;
}
Run Code Online (Sandbox Code Playgroud)
仍然采用这种方法的唯一问题是重新入门 - 这意味着如果func在信号处理程序中调用缓存值,可能会搞砸.
如果在多线程应用程序中运行,则在使用此方法时还必须提供某种锁定机制,否则您迟早会搞砸.
可能你会在这种情况下被搞砸了,因为你必须澄清在执行过程中" 最后"对函数和值的调用是什么意思.
当前正确的值是在线程B之前输入func但仍在执行的线程A或者在B之后输入但已经完成func执行的线程B的当前值?
再次阅读您的问题,您不是在检查变量是否发生变化,而是在检查同一词法标识符的两个不同实例是否不同。
除非通过显式比较,否则这是不可能的。
关于检测变量变化的原始答案:
在可移植的标准 C 或 C++ 中没有办法。
但是,有一些特定于环境的方法可以检测变量何时发生更改。您可以使用 MMU 访问控制标志(通过mprotect或VirtualProtect)在第一次写入时生成异常,并从处理程序内部设置脏标志。(几乎每个现代操作系统都会使用内存映射文件来执行此操作,以确定是否需要将其写回磁盘)。或者您可以使用硬件断点来匹配对该地址的写入(调试器使用它来在变量上实现断点)。
与旧值相比,这些都不会那么有效。(但与旧值相比会错过ABA场景)
| 归档时间: |
|
| 查看次数: |
11904 次 |
| 最近记录: |