gpt4 book ai didi

c - 从 C 中的堆栈中删除字符串

转载 作者:行者123 更新时间:2023-12-04 05:08:47 24 4
gpt4 key购买 nike

我想将我的 GLSL 着色器存储在我的可执行文件中以保持整洁,是否在函数内部定义的字符串将它们加载到着色器对象中,以便在函数返回时从堆栈中删除字符串?我应该以其他方式这样做吗? (我记得读过一些关于资源文件的东西,但我以前从未使用过那些)

最佳答案

I would like to store my GLSL shaders inside of my executable file for neatness,



这没什么用,但我能理解动机。

would having the string defined inside the function that will load them into shader objects get the strings removed from the stack when the function has returned?



这取决于你如何声明它。如果你写这样的东西:
void foo(…)
{
char const string[] = "....";
}

字符串内存在堆栈上分配,并使用初始化字符串文字的内容进行初始化。字符串文字本身是指向可执行文件常量数据段中特定位置的指针。数据段根据需要映射到进程地址(可执行文件的其余部分^1.

当函数返回时,内存被“释放”;从技术上讲,它只是回滚的堆栈指针。

如果你把它写成
void bar(...)
{
char const * string = "....";
}

变量 string使用指向常量数据段本身部分的指针进行初始化,该部分是字符串文字所在的位置。不分配内存,仅当实际访问文字所在的页面时才从磁盘读取内容。

从技术角度来看,访问字符串字面量增加的内存和 I/O 开销与为数据访问映射文件所增加的内存和 I/O 开销完全一样。事实上,可执行文件本身是 mmap-ed,所以这已经是对 mmap-ed 文件的访问。

[1] 在阻塞系统调用处等待很长时间的可执行文件最终将被换出系统内存,如果系统调用返回,它们会被换回。事实上,在现代操作系统中,所有系统内存都被视为块 I/O 缓存,进程内存分配被视为块设备的内容(这使得交换空间的实现变得微不足道);如果没有后备块设备,进程内存的“缓存”将变得不可交换。

关于c - 从 C 中的堆栈中删除字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15162127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com