引用是否具有存储位置,或者仅仅是另一个位置的别名?这是否因C ++版本不同而不同,或者是否与C ++的所有版本都一致?并且,如果引用具有存储位置,那么它是否只允许在类型之类的指针上使用值语义?
像这样使用参考如何工作:
struct aStruct{
int aVariable;
aClass& aReferencetoaClass;
};
Run Code Online (Sandbox Code Playgroud)
它会占用空间还是别名?
c++ reference memory-layout language-lawyer storage-duration
我知道函数中的变量正在使用堆栈空间。当函数退出时,空间被释放。这就是为什么我们应该在函数中将指针变量声明为静态。但是,我发现下面的代码运行良好。
海湾合作委员会版本是: gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
#include <stdio.h>
char *month_name(int n) {
char *name[] = {"Invalid name", "Jan.", "Feb", "Mar", "Apr", "May", "June",
"July", "Aug", "Sep", "Oct", "Nov", "Dec"};
return n < 1 || n > 12 ? name[0] : name[n];
}
int main() {
char *month;
month = month_name(2);
printf("%s\n", month); // The output is Feb
}
Run Code Online (Sandbox Code Playgroud)
看来函数中的变量被隐式转换为静态。谁能为我解释一下吗?提前致谢。
如果具有静态存储持续时间的对象的C++构造函数未初始化成员,那么是否需要保留先前的零初始化,或者是否使成员具有不确定的值?
我对C++规范的解读是它与自身相矛盾.
例:
#include <iostream>
struct Foo { Foo(); int x; } object;
Foo::Foo() { }
int main() { std::cout << object.x << std::endl; }
Run Code Online (Sandbox Code Playgroud)
Foo()构造函数没有显式初始化成员object.x,因此根据12.6.2第8段中的注释:
该成员具有不确定的价值.
但是,通过各种初始化的细节,这似乎是不正确的.成员object.x由于具有静态存储持续时间而被零初始化,然后我看不到任何改变它的东西.
关于构造函数,适用的12.6.2中的文本是:
该实体是默认初始化的.
在8.5第7段中,默认初始化的相关情况是:
......没有执行初始化
我读到这意味着默认初始化不会改变先前的零初始化.
我是否遗漏了一些其他文本,它们在构造函数调用开始时将所有成员重置为"不确定值"?
我在stackoverflow上发现了关于零初始化和默认初始化的各种其他问题,但我看不到任何分析在默认初始化跟随同一实体的早期初始化之后会发生什么.
在这种情况下,可能没有实际效果.但是在一个更复杂的构造函数中,一些成员被初始化而其他成员没有,编译器是否必须准确地跟踪哪些字节/位被初始化?或者它是否只是初始化整个对象(例如,将构造函数简化为memset()调用) )?
快速设置:我想在程序中传递字符串作为指针和大小.我有一个String类和一个用户定义的文字用于构造文字字符串:
struct String { const char *ptr; size_t sz; };
inline constexpr String operator "" _string(const char *s, size_t sz) {
return {s, sz};
}
int main() {
auto s = "hello"_string;
s.ptr[0]; //<-- is this access guaranteed to work?
}
Run Code Online (Sandbox Code Playgroud)
标准是否指定传递给我的用户定义的文字运算符的参数具有静态持续时间?即上面的代码实际上等同于写作:
int main() {
String s{"hello", 5};
}
Run Code Online (Sandbox Code Playgroud)
或者当我使用用户定义的文字时,是否允许编译器/链接器给我留下悬空指针?
(N4527的第2.13.8节似乎没有说明用户定义的字符串文字运算符的参数的存储类的主题.任何指向标准的相应部分的指针都将不胜感激.)
在C中,代码
char *c = "Hello world!";
Run Code Online (Sandbox Code Playgroud)
存储Hello world!\0在rodata中,并c使用指向它的指针进行初始化。除了字符串以外,我该如何处理?
具体来说,我正在尝试定义自己的字符串类型
typedef struct {
size_t Length;
char Data[];
} PascalString;
Run Code Online (Sandbox Code Playgroud)
然后想要某种宏,以便我可以说
const PascalString *c2 = PASCAL_STRING_CONSTANT("Hello world!");
Run Code Online (Sandbox Code Playgroud)
并且具有相同的行为,即\x0c\0\0\0Hello world!存储在rodata中,并c2使用指向它的指针进行初始化。
我尝试使用
#define PASCAL_STRING_CONSTANT(c_string_constant) \
&((const PascalString) { \
.Length=sizeof(c_string_constant)-1, \
.Data=(c_string_constant), \
})
Run Code Online (Sandbox Code Playgroud)
正如这些 问题中所建议的那样,但它不起作用,因为它Data是一个灵活的数组:我收到了错误error: non-static initialization of a flexible array member(对于gcc,clang给出了类似的错误)。
这在C中可能吗?如果是这样,PASCAL_STRING_CONSTANT宏将是什么样?
澄清
对于C字符串,以下代码块永远不会将字符串存储在堆栈中:
#include <inttypes.h>
#include <stdio.h>
int main(void) {
const char *c = "Hello …Run Code Online (Sandbox Code Playgroud) 我有一个关于在回答一个问题这个问题,但因为我有小于50代表我不能对此发表评论.
我想知道答案foo()被多次调用,并且静态变量被分配了相同的次数.那么为什么每次都不会将静态变量重新赋值为10?
#include <stdio.h>
int main(void) {
int memo[1000];
for (int i = 0; i < 1000; i++) {
printf("%d\t", memo[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为一切都应该初始化为 0 但事实并非如此。这有什么原因吗?非常感谢你的帮助。
静态局部变量如何在不同的翻译单元中共享?
我知道“静态”指定内部链接。
如果“静态”成员函数在不同的翻译单元中具有相同的地址,则每个翻译单元都有该函数的副本,并且链接器选择要包含在可执行文件中的副本之一。
然后,在两个不同翻译包含 1 个共享标头的情况下,该共享标头有一个带有静态成员函数的类,该静态成员函数会递增静态局部变量,并且每个翻译单元(cpp)调用共享标头的静态成员函数,每个翻译单元将增加自己的独立静态局部变量,因为 static 指定内部链接。例如,
共享.h
#pragma once
class CShared
{
public:
static inline void Foo()
{
static int s_nCount = 0;
++s_nCount;
}
private:
CShared(){}
~CShared(){}
};
Run Code Online (Sandbox Code Playgroud)
啊
#pragma once
class A
{
public:
A(){}
~A(){}
void Foo();
};
Run Code Online (Sandbox Code Playgroud)
a.cpp
#include "A.h"
#include "Shared.h"
void A::Foo()
{
CShared::Foo();
}
Run Code Online (Sandbox Code Playgroud)
巴赫
#pragma once
class B
{
public:
B(){}
~B(){}
void Foo();
};
Run Code Online (Sandbox Code Playgroud)
B.cpp
#include "B.h"
#include "Shared.h"
void B::Foo()
{
CShared::Foo();
}
Run Code Online (Sandbox Code Playgroud)
主程序 …
我知道谷歌云存储有 4 个存储选项,每个选项都有不同的“最短存储时间”
https://cloud.google.com/storage/docs/lifecycle?hl=vi
标准存储:无
近线存储:30 天
Coldline 存储:90 天
存档存储:365 天
“最短存储期限”是什么意思?
我猜想,“最短存储时间”是您的数据保留在 Google Cloud 存储中的时间。
如果不使用,您的数据将在此期限后自动删除吗?
如:
我的猜测对吗?
如果错了:请告诉我正确的事情。
#include <iostream>
using namespace std;
struct A {
// Some Other Code
int x;
};
A a1;
int main(){
A a2;
cout << "a1.x = " << a1.x << endl;
cout << "a2.x = " << a2.x << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C++14 标准 (ISO/IEC 14882:2014) 第 8.5 节,第 12 段:
如果没有为对象指定初始化程序,则该对象是默认初始化的。当获得具有自动或动态存储期限的对象的存储时,该对象具有不确定值,如果没有对该对象执行初始化,则该对象保留一个不确定值,直到该值被替换(5.17)。[注意:具有静态或线程存储持续时间的对象是零初始化的,参见 3.6.2。- 尾注]
那么a1有静态存储持续时间和a2自动存储持续时间吗?的定义Struct A在全局命名空间以及a1声明中,而a2声明在块范围内(在main()函数内部)。
此外,第 3.6.2 节说:
第 1 段:
作为程序启动的结果,具有静态存储持续时间的非局部变量被初始化。
第 2 段: …
storage-duration ×10
c++ ×5
c ×4
static ×2
arrays ×1
c++11 ×1
c++14 ×1
constructor ×1
linkage ×1
literals ×1
member ×1
recursion ×1
reference ×1
return-value ×1
struct ×1