常量字符串定义还是使用宏?有一个问题突然搞不清了:例如有一个字符串:Start Event书上会推荐我们定义成
常量字符串定义还是使用宏?
有一个问题突然搞不清了:
例如有一个字符串:"Start Event"
书上会推荐我们定义成
const char *EVENT_START = "Start Event";
而不推荐使用宏:
#define EVENT_START "Start Event"
但是如果是在这个大工程中,有非常多这样的字符串,手边的工程就有需要上万个这样的常量字符串,那么如果使用const char *来定义在某个文件中(这个文件就是专门放这些常量字符串的),这样会一开始就会占用很多不必要的内存,如果用宏#define的话,就不会占用内存了,只有在需要的时候才占用。
是一如即往的使用宏来定义这样的字符串呢还是分情况,如果只是些小工程就用const char *,真需要太多的时候就用宏?
[解决办法]你的概念完全错了。如果是宏,才会在所有用到的地方复制一份,占内存;如果是常量,用到的地方只是一个地址,存放的只有一份内容。
另外宏不具有类型安全性,容易造成代码错误,有时候还不好检查出来,所以推荐常量就用const定义。
话说人家一个语言专门推一个const关键字不会没用。
[解决办法]如果说是一个公用定义字符串的地方,有些工程用部分,有些工程用另一部份,这个在链接的时候是会由于常量的定义导致空间浪费。不过这是你们方法错了,大量的字符串,完全可以用配置文件,而不是放在程序里面,也方便管理、修改。
[解决办法]const char *EVENT_START = "Start Event";
这种方式所强调的是:
1、"Start Event”尽可能的被看作是字符串资源;
2、"Start Event”尽可能的只存储一个拷贝;
3、"Start Event”通常不会被随意修改。
[解决办法]>这两个常量字符串分别占用各自的空间而不是共享一个"Hello"吗?
编译器够傻的话才不共享。
[解决办法]
const char *EVENT_START = "Start Event";
//占用的内存有俩个部分: EVENT_START和"Start Event"
//对于"Start Event"和宏定义没有区别
//变量EVENT_START, 如果从来没有引用/使用过,一般会被优化掉,不用担心
//使用宏的缺点是没有类型,不够安全,容易出错。
[解决办法]楼主的想法是有一定道理的,在这个问题上,对于楼主的需求(节约空间),用宏比定义一大堆字符串字面量要好,不需要墨守成规,书中的建议并不是任何情况下都适合的。
不过,像楼主那样用类对象宏的话,恐怕要写成千上万条#define,完全可以改为类函数宏嘛,例如:
#define STRING( x ) #x
这样宏就仅需要写一条得了。缺点是,失去了对实例的约束,客户想怎么写就怎么写,楼主需要这种约束么?可以权衡一下。
对于楼主4楼的问题,答案是实现相关,对于同一个字符串字面量,编译器可以产生同一实例,也可以产生不同的实例,一般来说,编译器会提供编译器选项让客户自行选择。
[解决办法]编译器会合并同样的常量字符串,lz的2种写法,最后编译出来的结果应该是没啥区别的。
[解决办法]const char *EVENT_START = "Start Event";
#define EVENT_START "Start Event"
個人覺得這兩种寫法,應該是存在lz所考慮到的問題,
如果改成下面的寫法:
const char * const EVENT_START = "Start Event";
#define EVENT_START "Start Event"
編譯器應該會將他們同等對待吧。
[解决办法]宏这种东西在C++中并不提倡用,很多缺点,而它的优点完全可由inline以及const来替代。
至于楼主说的内存浪费问题,这个还得看编译器。如果编译器知道了某个const的所有使用,甚至可以不为该const分配空间。(C++程序设计语言---86页)
[解决办法]字符串所占用的内存宏和常量定义并没有什么区别, 链接的时候相同的字符串常量只会在编译后的文件中存在一份.
使用常量时, 保存常量字符串的指针变量通常来说是可以优化掉的, 也不会占用空间. 如果确实没优化掉的话, 就不仅是多占用了 4 个字节空间, 而且访问也会慢一点了.
[解决办法]c++ 一般会推荐 const char * 而不是宏,因为宏不支持 安全性检查,但我想推荐者可能并非针对 lz 工程的特例,设计就是一种平衡、折中、妥协
[解决办法]尺有所短,寸有所长。
[解决办法]各有各的用处。。如果不是多次使用的字符串还是const
这样更安全!!
------解决方案--------------------
假设有1W个字符串,每个有100个char,那么也才1M的空间,这点也承受不起?
[解决办法]何必纠结呢:
头文件做活一点,想和哪个都随意,默认的会是节省内存模式的,用到的点内存,不用到的不占内存
想使用const常量方式就定义一下宏USE_CONST_MODE,管它用到不用到都每个定义的常量都会占用空间
[解决办法]在c++中如果要用宏来定义的话,很容易出现一些意想不到的错误,而且要是多次用的话(上千个),就会很占内存,而要是用const char*他就只是占用一个地址空间,还是很省空间的,所以我建议你还是一如既往的用const char*比较好,不知道我的回复你满意不?
[解决办法]哈哈,混乱代码加密,不让别人容易看明白就常用宏定义!各有所长啦