热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个大的结构数组申明为全局变量好不好.

我们公司的编码规范上说:数组不能直接定义为全局变量,只能定义为数组指针,申请动态内存。但我在代码中常见有人这样写:源文件init_table.ctypedefstruct
我们公司的编码规范上说:
数组不能直接定义为全局变量,只能定义为数组指针,申请动态内存。

但我在代码中常见有人这样写:
//源文件 init_table.c
typedef struct
{
uint8 state;
uint8 dial_role;
uint8 dial_status;
uint16 errcode;
DID_T            diaid;       //结构变量
uint8 invk_ind_count;
INVK_OP_T        invk_ind[MAX_INVOKE_NUM];  //结构数组
uint8 invk_req_count;
INVK_OP_T        invk_req[MAX_INVOKE_NUM];  //结构数组
uint8 linkid_flag;
uint8 link_id;
uint8 app_ssn;
uint8 map_peer_ssn;
uint32 app_serial_id;
uint16 app_event_id;
uint32 timer_no;
uint8 timer_type;
uint16 primitive;
uint8 count;
ADDR_T            orig_addr;    //结构变量
ADDR_T           dest_addr;    //结构变量
uint16 flink;
uint8 r11;
}DIALOG_TBL_T;

#define   MAX_DIALOG_ID            3000
DIALOG_TBL_T dialtbl[MAX_DIALOG_ID];  //这里dialtbl是个大的结构数组,其中结构还嵌套着结构,把它定义为一个全局变量,是不是不符合规范呢?那规范有什么好处呢?

如果照规范做,应该怎么做一下?
是不是动态申请:

DIALOG_TBL_T *dialtbl = (DIALOG_TBL_T *)malloc(size(DIALOG_TBL_T)*3000 + 1);

8 个解决方案

#1


我觉得不能死抠规范,某些时候这些数组的生命期确实很长,甚至跨越整个任务的生命期,并且这些数组具有公共的特性,对各个模块都有作用。这个时候声明为全局变量未尝不可。

不清楚你们公司的规范是不是针对某些平台的特殊需求进行的定义,也许只是为了限制全局变量的数量而已。

#2


尽量不要用全局的,可改的地方太多,麻烦。

#3


公司代码是跑在单板上的,可能也有这个原因!

主要是这个结构数组确实很大,结构里面又套结构,所以定义为全局变量,是不是对全局变量所存放的区域(是什么区我也不太清楚,请高人给指点一下)有影响呢?

#4


能有人再给说说吗?
结构数组很大,结构里面又套结构,定义为全局变量,是不是对全局变量所存放的区域有影响呢?

#5


我的一点初浅看法:

全局变量存放在静态数据区,malloc存放在堆空间。
一般来说,操作系统对进程的栈和静态存储区都有大小限制,而堆空间基本上只受到实际物理内存(含虚拟内存或交换区)的限制。因此,大的数据量都不要定义成全局变量。
全局变量的危害还在于破坏模块的独立性,增加模块间的耦合性。因此,一般只使用单个模块间的全局变量,而不使用多个模块都能访问的全局变量。如果万一要让多个模块共享全局变量,也尽量只让一个模块创建和写入,而其它模块只读。否则会给程序带来不稳定性,也难以维护修改。
简单的说,如果满足以下几种情况,可以使用全局变量:
1。数据量不大
2。只在一个功能模块内起作用,即“局部全局变量”,(很拗口,呵呵)
3。如果多个模块共享一个全局变量,让它只能被一个模块修改,其它只读。

否则,还是尽量放到堆栈上去,采用参数传递。

#6


完了完了,没看清楚,居然是0分帖。白忙活了半天。

#7


公司的编码规范上 是死的人是活的。
有需要当然可以做啊,不要泛滥即可

#8


hqx8211
呵呵,不要在意,我是对CSDN上的这个给分制度不太熟悉,所以我就没有给分,你的回答让我和许多人都受益了,谢谢你.争取下次我也免费回答你一个问题:)

推荐阅读
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • Java编程实现邻接矩阵表示稠密图的方法及实现类介绍
    本文介绍了Java编程如何实现邻接矩阵表示稠密图的方法,通过一个名为AMWGraph.java的类来构造邻接矩阵表示的图,并提供了插入结点、插入边、获取邻接结点等功能。通过使用二维数组来表示结点之间的关系,并通过元素的值来表示权值的大小,实现了稠密图的表示和操作。对于对稠密图的表示和操作感兴趣的读者可以参考本文。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
author-avatar
Andou1983
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有