问题标签 [storage-duration]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
96 浏览

c++ - 如何确保参数仅指向静态存储期间的对象?

我想确保给函数的参数指向(或引用)具有静态存储持续时间类的对象。

该解决方案需要在没有编译器特定扩展的情况下使用 C++11。

我在研究过程中发现的最相似的问题是仅限于 C 语言的问题。到目前为止,那里提出的解决方案仅适用于编译器特定的扩展。

我想过使用非类型模板参数来限制指向静态存储持续时间的指针,如下所示:

不幸的是,这(至少)有以下警告:

  • 对象必须具有链接(在 C++17 之前)。这不包括例如函数本地静态对象。
  • 对于每个指针,都会实例化一个函数模板。我怀疑在实际(生产)部署中通过编译器优化可以避免多少代码重复。将定义关于允许在我的情况下使用的优化级别的约束。

如何才能确保赋予函数的参数仅在静态存储期间指向(或引用)对象?最好没有我概述的提案的警告。欢迎根本不同的解决方案!

0 投票
3 回答
521 浏览

c - 如何在 rodata 中初始化一个灵活的数组并创建一个指向它的指针?

在 C 中,代码

存储Hello world!\0在rodata中并c使用指向它的指针进行初始化。我怎么能用字符串以外的东西来做到这一点?

具体来说,我正在尝试定义自己的字符串类型

然后想要某种宏,这样我就可以说

并让它表现相同,因为\x0c\0\0\0Hello world!它存储在rodata中并c2用指向它的指针进行初始化。

我尝试使用

正如这些 问题中所建议的那样,但它不起作用,因为它Data是一个灵活的数组:我得到了错误error: non-static initialization of a flexible array member(使用 gcc,clang 给出了类似的错误)。

这在C中可能吗?如果是这样,PASCAL_STRING_CONSTANT宏会是什么样子?

澄清

对于 C 字符串,以下代码块永远不会将字符串存储在堆栈中:

正如我们通过查看程序集所看到的,第 5 行编译为仅将指针加载到寄存器中。

我希望能够使用 pascal 字符串获得相同的行为,并且可以使用 GNU 扩展。以下代码也从不将帕斯卡字符串存储在堆栈中:

查看其生成的程序集,第 18 行也只是加载了一个指针。

但是,我发现在 ANSI C 中执行此操作的最佳代码会生成将整个字符串复制到堆栈的代码:

为此代码生成的程序集中,第 19 行将整个结构复制到堆栈上,然后生成指向它的指针。

我正在寻找生成与我的第二个示例相同的程序集的 ANSI C 代码,或者解释为什么 ANSI C 不可能。

0 投票
1 回答
60 浏览

c - Why are objects with automatic storage not zeroed when static objects are?

In C, objects with automatic storage have an indeterminate value if they are not initialized, but static objects does not. From the standard:

If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static or thread storage duration is not initialized explicitly, then:

  • if it has pointer type, it is initialized to a null pointer;
  • if it has arithmetic type, it is initialized to (positive or unsigned) zero;
  • if it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits;
  • if it is a union, the first named member is initialized (recursively) according to these rules, and any padding is initialized to zero bits;

We all know that C is a pretty unforgiving language that gives all the responsibility to the programmer, so it makes me wonder a bit why they decided to zero initialize static objects. I also wonder why automatic arrays are completely zero initialized if and only if at least one element is manually initialized. But what makes me most curious is why they did not choose to do this either for everything or nothing.

What is the rationale behind this?

0 投票
2 回答
148 浏览

c++ - 存储持续时间与 C++ 中的位置

有时,我看到存储持续时间和发生地点之间存在混合概念。那是因为有时我会看到以下声明:

但这真的 100% 正确吗?C++ 是否确保存储发生在哪里或者,它是由编译器决定的?

存储位置是否与持续时间无关?

例如,取这两个片段:

与:

两者都或多或少等效于 的生命周期i,它在块的开头创建并在块的末尾删除,这里编译器可以只使用堆栈(我不知道!),相反的情况也可能发生:

与:

这两种情况应该在堆中以避免堆栈溢出(或者至少是到目前为止我被告知的......),除了存储持续时间之外,编译器是否也考虑到了这一点?

0 投票
2 回答
69 浏览

c++ - 为什么我在 C++ 中声明一个(本地)int 数组而不做任何事情的代码用零初始化?

我有两个 C++ 代码,其中一个具有全局 int 数组,而另一个代码具有一个本地数组,其长度由用户输入确定(因此在运行时)。两个数组都没有显式初始化。

我观察到全局数组用零填充,而本地数组(其长度在运行时确定)没有用零填充,而是用随机数填充(但一次相同)。我使用了 g++ 编译器。

这是什么行为?C++ 标准是否定义了这种行为?

0 投票
1 回答
430 浏览

c - C - const 问题 - 错误:初始化元素不是常量

我尝试在我的buttons.c文件中添加全局变量,但有一个错误 - initializer element is not constant。示例headers.h文件

当文件main.c调用文件buttons.c时,我无法定义变量text_entry。我究竟做错了什么?

按钮.c

我看到了很多关于静态的类似问题,但是

不工作。如何将此变量定义为全局变量?避免类似功能的重复

0 投票
5 回答
328 浏览

c - 为什么char数组在C中为空

我的代码如下:

上面的代码打印出空字符串,但是当我取消注释该行时:printf("turnStr=%s\n",turnStr) 它能够打印出正确的字符串。我知道函数结束时堆栈空间无法返回,但我对添加时感到困惑printf("turnStr=%s\n",turnStr),它可以打印出字符串。

0 投票
3 回答
85 浏览

c++ - 在堆栈上分配的向量元素?

上面的代码按预期打印:

但我有两个问题:

  1. A{} 是在堆栈上创建的吗?run() 返回后会被清理吗?
  2. 是在堆栈上分配的吗?append() 返回后会被清理吗?

更新:

输出:

我更新了问题中的代码,添加了复制/移动构造函数。我发现复制构造函数在追加中被调用了 3 次。我理解 auto a = v.back(); 需要一个副本,但其他两个副本也许应该避免?

0 投票
1 回答
972 浏览

google-cloud-storage - Meaning of "Minimum storage duration" of Google Cloud storage

I know that Google Cloud storage has 4 options of storage and each options has a different of "Minimum storage duration"

https://cloud.google.com/storage/docs/lifecycle?hl=vi

Standard Storage: None

Nearline Storage: 30 days

Coldline Storage: 90 days

Archive Storage: 365 days

What is the meaning of "Minimum storage duration"?

I guess that, "Minimum storage duration" is the time that your data has been keep in Google Cloud storage.

Is it the period after which your data will automatically be deleted if not used?

Such as:

  • I use options Nearline Storage: 30 days to store my data.
  • If within 30 days I don't use this data. It will be delete
  • If I use this data frequently. It will be stored until I delete my bucket.

Is my guess right?

If wrong: please tell me the right thing.

0 投票
1 回答
87 浏览

c - “递归输入块”是什么意思?

我在reddit上问了一个问题。问题实际上是为什么自动对象(没有 VLA)的生命周期的起点在对象的范围之前?
我得到了答案,这可以作为我的问题的例子。

代码

输出

但是有人说“当它的声明达到时,它的值j变得不确定,......”因为 C17 6.2.4p6(用我的粗体字)

对于这样一个没有可变长度数组类型的对象,它的生命周期从进入与其关联的块开始,直到该块的执行以任何方式结束。(进入封闭的块或调用函数会暂停,但不会结束当前块的执行。)如果递归地进入块,则每次都会创建对象的新实例。对象的初始值是不确定的。如果为对象指定了初始化,则在执行块时每次到达声明或复合文字时都会执行它;否则,每次达到声明时,该值变得不确定。

仅转到当前块中的标签不同于在递归函数或迭代语句中重复整个关联块。从这个角度来看,我认为j不受规则的影响(但这只是我的想法)。

顺便说一句,我认为无论我们以哪种方式思考,都存在矛盾。
- 如果int j;没有在每个序列中重新创建,则为重新定义。
- 如果int j;在每个序列中重新创建,j则应具有来自第二个序列的垃圾值。但输出显示为好像保留了“j”的值。

我一遍又一遍地阅读引用的部分文档,但无法理解。我错过了什么?