gpt4 book ai didi

c - 复合文字的存储期限

转载 作者:行者123 更新时间:2023-12-03 09:22:04 25 4
gpt4 key购买 nike

我不知何故无法理解 block 中定义的复合文字的存储持续时间是如何自动的,推理如下:

让我们假设复合文字是在重复调用的函数或 block 中定义的;当第一次调用这个函数时,如果它不是在静态内存中,计算机如何创建文字? (我的意思是他怎么知道它的值?例如是(int [2]){2,4}还是(int [5]){5,4,2,1,4})并且如果它某种东西存在于任何地方,计算机如何再次知道它的内容? (当他尝试为第二次和随后的每次调用再次构建它时)在它第一次消失后。

其他文字(例如字符串文字和普通文字)的情况是它们位于静态内存中,这是非常合理的,因为如果计算机没有将该值存储在某处,那么计算机如何知道它的值。

谁能向我解释一下这个问题吗?

最佳答案

也许将对象称为“复合文字”有点误导。它实际上并不是那么字面意思。

考虑一个实际的例子是有帮助的,即使它有点愚蠢:

/* This is NOT the way to solve this problem */
double cubic(double x, double a, double b, double c, double d) {
double* powers = (double []){1, x, x*x, x*x*x};
double* coefficients = (double []){a, b, c, d};
double sum = 0;
for (int i = 0; i < 4; ++i) sum += powers[i]*coefficients[i];
return sum;
}

该函数中有两个复合文字,很明显,它们都不能预先构造,因为它们依赖于函数参数。

幸运的是,C 编译器是一个编译器。它不限于从现有常量的副本创建新的数据结构。它可以生成在堆栈上分配两个数组的代码(“自动存储”),然后适本地填充它们。

编译器为这些复合文字分配堆栈空间并不困难,因为它确切地知道它们有多大。实际上,生成的代码与我编写的代码完全相同:

double cubic(double x, double a, double b, double c, double d) {
double _powers_values_[4];
_powers_values_[0] = 1;
_powers_values_[1] = x;
_powers_values_[2] = x*x;
_powers_values_[3] = x*x*x;
double* powers = _powers_values_;
// ...

如果您查看原始函数的生成代码,您会看到这样的结果。

另请注意,powerscoefficients 都是可变的,因此我可以在函数中修改它们:

/* This is NOT the way to solve this problem */
double cubic(double x, double a, double b, double c, double d) {
double* powers = (double []){1, x, x*x, x*x*x};
double* coefficients = (double []){a, b, c, d};
for (int i = 0; i < 4; ++i) coefficients[i] *= powers[i];
for (int i = 1; i < 4; ++i) coefficients[i] += coefficients[i+1];
return coefficients[3];
}

当然,复合文字可能只有常量值:

double* coefficients = (double []){17, 6, -3, 2.5};

但正如所写,该数组仍然是可变的,因此编译器需要安排函数拥有值的新副本。如果我愿意,我可以明确表示该数组是不可变的:

const double* coefficients = (const double []){17, 6, -3, 2.5};

现在编译器可以使用静态文字,而不是进行不必要的复制。但是,从理论上讲,复合文字仍然具有自 Action 用域,并且从函数返回指向它的指针将是未定义的行为。

关于c - 复合文字的存储期限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28650558/

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