当前位置: 首页 > 知识库问答 >
问题:

检测结构成员变化的有效方法?

陶琦
2023-03-14

这似乎应该是简单的,但我没有找到太多相关的它。我有一个结构,它有不同的字段用来存储关于程序操作的数据。我想记录这些数据,以便以后分析。试图在程序运行过程中连续记录数据会消耗大量资源。因此,我只想在数据发生变化时调用日志记录函数。如果有一种有效的方法来检查结构成员是否更新了,我会很高兴的。目前我正在玩一个有3个结构(旧的、当前的和新的)的shell游戏,以便检测数据何时发生了变化。提前道谢。

共有1个答案

贾越
2023-03-14

您可以在日志函数中跟踪结构及其散列。

让你有一个哈希函数:

int hash(void* ptr, size_t size);

让您有一个从指向结构的指针到结构的散列的映射,比如:

/* Stores hash value for ptr*/
void ptr2hash_update_hash(void* ptr, int hash);
/* Remove ptr from mapping */
void ptr2hash_remove(void* ptr);
/* Returns 0 if ptr was not stored, or stored has otherwise*/
int ptr2hash_get_hash(void* ptr);

然后您可以检查对象是否在日志调用之间进行了更改,如下所示:

int new_hash = hash(ptr, sizeof(TheStruct));
int old_hash = ptr2hash_get_hash(ptr);
if (old_hash == new_hash)
    return;

ptr2hash_update_hash(ptr, new_hash);
/* Then do the logging */

执行free(ptr)时,不要忘记从映射中删除ptr:)

这里是简单的哈希表实现,您将需要它来实现ptr2hash映射。这里有简单的哈希函数。

 类似资料:
  • 主要内容:使用“键值对”初始化结构体,使用多个值的列表初始化结构体,初始化匿名结构体结构体在实例化时可以直接对成员变量进行初始化,初始化有两种形式分别是以字段“键值对”形式和多个值的列表形式,键值对形式的初始化适合选择性填充字段较多的结构体,多个值的列表形式适合填充字段较少的结构体。 使用“键值对”初始化结构体 结构体可以使用“键值对”(Key value pair)初始化字段,每个“键”(Key)对应结构体中的一个字段,键的“值”(Value)对应字段需要初始化的值。 键值对的

  • 此代码编译: 该代码不: 报告的错误(在 MSVC、gcc 和 clang 中)表明他们认为 构造函数未定义或不是 ,例如。从叮叮当当: 为什么? (可能与这个问题有关,但在使用时应该是完整的;只有仍然不完整。

  • 问题内容: 我想做的正是这个家伙所做的: Python-计算符号变化 但是,我需要对其进行优化以使其超快运行。简而言之,我想采用一个时间序列,并告诉它每次穿越时都越过零(更改符号)。我想记录两次过零之间的时间。由于这是真实数据(32位浮点数),我怀疑我每个人都有一个正好为零的数字,所以这并不重要。我目前有一个计时程序,所以我将为您的成绩计时,以查看谁获胜。 我的解决方案给出了(微秒): 如您所见,

  • 为了节省内存(是的,它很重要),如果为false,我想省略浮动。由于中还有很多其他内容,因此最好的方法如下所示: 不过,据我所知,在C++中没有零大小的类型。唯一的例外似乎是“灵活数组成员”,所以我也许可以做一些类似的事情: 只不过它们只在C99中得到支持,而不是在C++中得到支持。 标准的解决方案似乎是使用继承,因为基类可以是零大小的,但是我的结构也可以由程序集访问,为了使程序集更简单,如果在结

  • 问题内容: 我已经开始使用dirent.h库,并且遇到了“ struct dirent”构造函数的一个非常有用的成员,该结构在我的书中构造了dirent * p-> d_name。但是不幸的是,它没有声明该结构的任何其他成员; 我想知道这个结构的成员还有什么用? 问候 问题答案: 该结构是指目录条目。 http://www.gnu.org/software/libc/manual/html_nod

  • Figure: Change Detector by Vovka is licensed under Public Domain () 变化检测在旧版本的Angular和新版本之间发生了很大的变化。在Angular 1中,框架保留了一长串观察者(每个属性绑定到我们的模板),需要在每次 digest 循环开始时检查。这被称为脏检查,它是唯一可用的变化检测机制。 在Angular 2中,信息流是单向的