字符串的静态存储持续时间

问题描述

在测试以下内容

    const [data,setData] = useState([]);

    useEffect(() =>
    {
        const fetchData = async () =>
        {
            const result = Promise(axiosInstance.get('bucket/fin-data/' + slug)
                .then(setData(result.data)));
            };
        fetchData();
    },[]);

你好
0x5618b7d478c7
0x5618b7d478c7
0x5618b7d478c7

我注意到 char* x = "Hello"; printf("%s %p %p %p","Hello",x,"Hello"); 在所有情况下都具有相同的内存地址,这意味着编译器将字符串 "Hello" 一次存储在 "Hello" 中(应该如此)。

语言规范的这一部分是否是因为每当使用字符串文字时,都应该在存储之前查找它是否已经存在?或者这是否被认为是不存储重复字符串的编译器优化?

解决方法

允许编译器对字符串和复合文字进行此类优化。只要它们的值正确地呈现给应用程序,它们就可以共享存储。但另一方面,我们没有义务这样做。

其他的对象,变量,即使内容相同,也都保证占用自己的存储空间,这样所有这些对象都有一个唯一的地址。

,

关于为字符串文字创建的数组,C 2018 6.4.5 7 说:

如果这些数组的元素具有适当的值,则未指定它们是否不同。如果程序尝试修改这样的数组,则行为未定义。

这意味着编译器可以按照其设计者的选择对相同的字符串使用相同或不同的内存。这包括作为其他字符串的子字符串,例如 "world""Hello world"

,

一般而言,行为取决于编译器选项。您可以设置编译器将相同的字符串文字存储为一个字符串文字或不同的字符串文字。

所以你不应该在这样的情况下中继

if ( "Hello" == "Hello" )

它将被评估为真。

根据 C 标准(6.4.5 字符串文字)

7 未指定这些数组是否不同,只要它们 元素具有适当的值。如果程序试图 修改这样的数组,行为未定义。

,

是的,它被认为是编译器优化。它被命名为 string interning。在 GCC 上,它由 -fmerge-constants 启用。