字符串常量,该怎么解决
字符串常量
在定义一个字符串变量的时候,
char a[] = "abcdefgh";
在数据段会保存这个字符串常量"abcdefgh",
因为 类似的定义很多, 而且每一个字符串有很长, 大约有几万个字符,
这样就会占用了大量的内存,得不到释放。
像这种字符串,我用完了就释放了, 不想在数据段备份,
有什么好的方法呢?
我现在使用的编译器是g++.
(好像是gcc的编译器不会有这种情形)
------解决思路----------------------
好像没什么好办法
你可以试试 这些字符串存在文本文件里面
程序运行的时候 从文件里面读取
就不会占用数据段
------解决思路----------------------
new。动态分配的方法行吧
------解决思路----------------------
a在栈 但是 "abcdefgh"在数据段
------解决思路----------------------
你可以看一下,a这个东西实际上是不存在的,当你使用char a[] = "asfsadfsdfsa";的时候,a标识的那块就申请了一块空间用来存放字符串。这个或者和char *a = "asdfasdfas";比较,可能比较清楚。
------解决思路----------------------
你把字符串弄到内存里 就是要处理它啊 如果不需要就不要弄进来啊 如果的确要同时处理这么多字符串那也没办法啊
没什么好办法的
------解决思路----------------------
嗯,估计 a 的 initializer 必须在数据段了,开栈的时候新内存里是垃圾值,需要从一个有效的源初始化数组,目测这个源头只能在数据段了,然后放在可执行文件中。要不然试试把这些字符串放在文件中,程序中要用的时候先去文件里读取?
------解决思路----------------------
内存资源有限的话可以考虑设计个虚拟内存,使用数据的时候把数据导入进来
用一点导入一点,大部分数据保存在文件里面
只能用时间换空间了
------解决思路----------------------
看了上面这么多回复,发现很多都没搞清楚关键的:
楼主要的字符串必须已经存在而且在程序执行的时候能获取到
你又不想这些字符串占执行体的存储空间、又不想从文件获取,那就是根本不可能实现的了的事情。什么方法都没用的。
可能缓解的方法:用压缩过的字符串,用到的时候动态解压还原、还原后的字符串用完后马上丢弃。但是同样的,这些压缩过的内容也是占空间的,总之得有地方获取到。
说一下:
char a[] = "abcdefg"这行代码的字符串实际上是占了2份的,abcdefg本身占用的存储空间不会省,除此外在a入栈的时候会将这个字符串复制进栈内存中,这样用到的时候就有了2份。如果你改成const char * a = ...则可以把栈内存和拷贝时间省下来,但是abcdefg省不了
有人说用动态内存,那只是把临时字符串挪了个地方,情况实际上和上面还是一样的:都是影响副本所占内存,而生成副本的来源必须要存在,这个前提变不了。如果嫌弃占内存太多,只能考虑从文件或其他非内存的存储位置来取了。如果你想完全不占空间,运行的时候才临时生成,根本不可能
在定义一个字符串变量的时候,
char a[] = "abcdefgh";
在数据段会保存这个字符串常量"abcdefgh",
因为 类似的定义很多, 而且每一个字符串有很长, 大约有几万个字符,
这样就会占用了大量的内存,得不到释放。
像这种字符串,我用完了就释放了, 不想在数据段备份,
有什么好的方法呢?
我现在使用的编译器是g++.
(好像是gcc的编译器不会有这种情形)
------解决思路----------------------
好像没什么好办法
你可以试试 这些字符串存在文本文件里面
程序运行的时候 从文件里面读取
就不会占用数据段
------解决思路----------------------
new。动态分配的方法行吧
------解决思路----------------------
a在栈 但是 "abcdefgh"在数据段
------解决思路----------------------
a在栈 但是 "abcdefgh"在数据段
在定义一个字符串变量的时候,
char a[] = "abcdefgh";
这个应该不在数据段吧,没记错的话,应该在栈中吧。
------解决思路----------------------
你把字符串弄到内存里 就是要处理它啊 如果不需要就不要弄进来啊 如果的确要同时处理这么多字符串那也没办法啊
没什么好办法的
------解决思路----------------------
在定义一个字符串变量的时候,
char a[] = "abcdefgh";
在数据段会保存这个字符串常量"abcdefgh",
a 是字符数组,不是字符串常量,不会放在常量区的。
局部数组离开作用域时就释放了。
我也是这么理解的, 也是这么做的,
但是编译后发现,这个字符串确实会放在data段。
因为这个字符串很大,大概有50K。
所以做过几次试验,如果将字符串减小到“abc”,
data段内存就会减小50K。
不知道有没有编译参数可以优化控制
嗯,估计 a 的 initializer 必须在数据段了,开栈的时候新内存里是垃圾值,需要从一个有效的源初始化数组,目测这个源头只能在数据段了,然后放在可执行文件中。要不然试试把这些字符串放在文件中,程序中要用的时候先去文件里读取?
------解决思路----------------------
内存资源有限的话可以考虑设计个虚拟内存,使用数据的时候把数据导入进来
用一点导入一点,大部分数据保存在文件里面
只能用时间换空间了
------解决思路----------------------
看了上面这么多回复,发现很多都没搞清楚关键的:
楼主要的字符串必须已经存在而且在程序执行的时候能获取到
你又不想这些字符串占执行体的存储空间、又不想从文件获取,那就是根本不可能实现的了的事情。什么方法都没用的。
可能缓解的方法:用压缩过的字符串,用到的时候动态解压还原、还原后的字符串用完后马上丢弃。但是同样的,这些压缩过的内容也是占空间的,总之得有地方获取到。
说一下:
char a[] = "abcdefg"这行代码的字符串实际上是占了2份的,abcdefg本身占用的存储空间不会省,除此外在a入栈的时候会将这个字符串复制进栈内存中,这样用到的时候就有了2份。如果你改成const char * a = ...则可以把栈内存和拷贝时间省下来,但是abcdefg省不了
有人说用动态内存,那只是把临时字符串挪了个地方,情况实际上和上面还是一样的:都是影响副本所占内存,而生成副本的来源必须要存在,这个前提变不了。如果嫌弃占内存太多,只能考虑从文件或其他非内存的存储位置来取了。如果你想完全不占空间,运行的时候才临时生成,根本不可能