编译和链接过程如何工作?
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
关键字static是一个在C++中具有多种含义的关键字,我发现它非常令人困惑,我永远无法理解它实际上应该如何工作.
根据我的理解,static存储持续时间,这意味着它在全局的情况下持续程序的生命周期,但是当你谈论本地时,它意味着它默认为零初始化.
C++标准对具有关键字的类数据成员说明了这一点static:
3.7.1静态存储持续时间[basic.stc.static]
3关键字static可用于声明具有静态存储持续时间的局部变量.
4应用于类定义中的类数据成员的关键字static为数据成员提供静态存储持续时间.
局部变量是什么意思?这是一个函数局部变量吗?因为还有一个当你声明一个本地函数时static,它只被初始化一次,它第一次进入这个函数.
它也只谈到关于类成员的存储持续时间,它是非实例特定的,那也是staticno 的属性?或者是存储持续时间?
那么static和文件范围的情况如何呢?是否所有全局变量都被视为默认具有静态存储持续时间?以下(来自第3.7.1节)似乎表明:
1所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间.这些实体的存储应持续该计划的持续时间(3.6.2,3.6.3)
如何static与变量的链接相关?
整个static关键字是彻头彻尾的混乱,有人可以澄清英语的不同用途,并告诉我何时初始化一个static类成员?
汇编程序中EDI和ESI寄存器的实际用途和用途是什么?
我知道它们只用于字符串操作.
有人也可以举个例子吗?
有人可以简单解释什么是线程争用吗?
我用Google搜索了它,但似乎无法找到一个简单的解释.
我今天去了一个面试,并得到了这个有趣的问题.
除了内存泄漏和事实上没有虚拟dtor,为什么这个代码会崩溃?
#include <iostream>
//besides the obvious mem leak, why does this code crash?
class Shape
{
public:
virtual void draw() const = 0;
};
class Circle : public Shape
{
public:
virtual void draw() const { }
int radius;
};
class Rectangle : public Shape
{
public:
virtual void draw() const { }
int height;
int width;
};
int main()
{
Shape * shapes = new Rectangle[10];
for (int i = 0; i < 10; ++i)
shapes[i].draw();
}
Run Code Online (Sandbox Code Playgroud) 我有一个小的对象层次结构,我需要通过套接字连接进行序列化和传输.我需要序列化对象,然后根据它的类型反序列化它.有没有一种简单的方法在C++中实现这一点(就像在Java中一样)?
是否有任何C++序列化在线代码示例或教程?
编辑:为了清楚,我正在寻找将对象转换为字节数组,然后返回到对象的方法.我可以处理插座传输.
我想知道哪个单元测试框架真的很熟悉?我知道这可能是一个意见问题,但我想我还是会问.我知道有一天我需要这样做,所以我不妨学习使用它.我知道那里有很多,但哪一个对C#开发有效?
从这个问题我可以看出单元测试是必要的,但我个人并没有使用它.这就是我问这个问题的原因.
这个问题来自回答Stack Overflow问题为什么书籍会说"编译器为内存中的变量分配空间"?,我试图向OP演示当你在堆栈上分配一个变量时会发生什么,以及编译器如何生成知道要分配的内存大小的代码.显然,编译器分配的空间比需要的多得多.
但是,在编译以下内容时
#include <iostream>
using namespace std;
int main()
{
int foo;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在调试模式下编译的Visual C++ 2012得到以下汇编程序输出,但没有优化:
int main()
{
00A31CC0 push ebp
00A31CC1 mov ebp,esp
00A31CC3 sub esp,0CCh // Allocates 204 bytes here.
00A31CC9 push ebx
00A31CCA push esi
00A31CCB push edi
00A31CCC lea edi,[ebp-0CCh]
00A31CD2 mov ecx,33h
00A31CD7 mov eax,0CCCCCCCCh
00A31CDC rep stos dword ptr es:[edi]
int foo;
return 0;
00A31CDE xor eax,eax
}
Run Code Online (Sandbox Code Playgroud)
在int我的程序中再添加一个,使上面的注释行显示如下:
00B81CC3 sub esp,0D8h // Allocate 216 bytes …Run Code Online (Sandbox Code Playgroud) 在C++中,从函数返回函数local std :: string变量的最佳方法是什么?
std::string MyFunc()
{
std::string mystring("test");
return mystring;
}
std::string ret = MyFunc(); // ret has no value because mystring has already gone out of scope...???
Run Code Online (Sandbox Code Playgroud) c++ ×6
c# ×2
c++-faq ×2
.net ×1
assembly ×1
linker ×1
linq ×1
marshalling ×1
pointers ×1
return-value ×1
static ×1
swap ×1
unit-testing ×1
x86 ×1