让T一个C++类。
以下三个指令之间的行为有什么区别吗?
T a;
T a();
T a = T();
Run Code Online (Sandbox Code Playgroud)
为不带参数的构造函数提供显式定义这一事实是否会T改变问题?
后续问题:如果为T至少带有一个参数的构造函数提供定义呢?那么以下两条指令之间的行为是否会有所不同(在本示例中,我假设构造函数仅采用一个参数)?
T a(my_parameter);
T a = T(my_parameter);
Run Code Online (Sandbox Code Playgroud) 在下面的 C 程序中,对函数的调用创建了一个相当大的局部变量buf,然后函数返回并且程序处于无限循环中。buf正如人们所预料的那样,在调用该函数时,系统的 RAM 使用量会增加等于 的大小;但是,函数返回后(显示“完成”),RAM 使用量不会下降,而是保持不变。
为什么函数返回后这个堆栈分配的缓冲区没有立即释放?如何制定这种行为的一般行为,并描述在哪些情况下它可能会或可能不会立即释放?
#include <stdlib.h>
#include <stdio.h>
void f()
{
int buf[1000 * 1000 * 200];
}
int main()
{
f();
printf("Done\n");
for (;;);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
PS 这是在 Linux Ubuntu 上运行的。
PS 我编译时没有进行编译器优化
PSf以“闪烁”方式调用(重复[开 - 延迟 - 关 - 延迟])而不是一次调用会导致类似的 RAM 使用时间线。
我理解,指向const的指针是一个指针,通过该指针无法更改该指针所指向的变量的值。因此,在下面的示例中,我希望编译器会引发错误:
\nint main()\n{\n int a = 42;\n const int *ptr = &a;\n ptr[0]++;\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n现在,为什么下面的示例也会出现错误?
\nint main()\n{\n int a = 42;\n const int *ptr = &a;\n ptr[1]++;\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n第二个示例(使用ptr[1]++)抛出error: increment of read-only location \xe2\x80\x98*(ptr + 4)\xe2\x80\x99。因此,看起来不仅指针指向的变量的值不能改变,其他相关内存位置的值也不能改变。
与此相关的具体行为是什么?此行为在哪里引用?例如,https://en.cppreference.com/w/c/language/pointer对我来说似乎并不清楚。
\n