C++的一个特性是能够创建未命名(匿名)命名空间,如下所示:
namespace {
int cannotAccessOutsideThisFile() { ... }
} // namespace
Run Code Online (Sandbox Code Playgroud)
您会认为这样的功能是无用的 - 因为您无法指定命名空间的名称,所以无法从外部访问其中的任何内容.但是这些未命名的命名空间可以在它们创建的文件中访问,就好像你有一个隐含的using子句.
我的问题是,为什么或何时使用静态函数会更好?或者他们基本上是两种做同样事情的方式?
我已经被要求修改的驱动程序代码中经常看到静态结构声明.
我试图寻找有关为什么structs声明为静态的信息以及这样做的动机.
你能有人帮我理解这个吗?
即使C++中没有静态类,来自Java背景我也会创建一个类似于Util只包含静态方法的辅助类.这被认为是不好的风格还是通常的做法?我看到的一个替代方案是使用C函数(根本没有类上下文).有什么其他选择吗?有什么优点和缺点,在哪种情况下我会使用其中任何一种.
在c ++中定义一堆静态方法建议使用命名空间静态函数作为一种替代方法,尽管我没有看到static没有类上下文的关键字有什么影响.
假设我们有一个看起来像这样的类:
class A
{
public:
int FuncA( int x );
int FuncB( int y );
int a;
int b;
};
Run Code Online (Sandbox Code Playgroud)
现在,我知道这个类的对象将只用这两个对象在内存中进行布局ints.也就是说,如果我创建一个类实例的向量A,则ints一个实例将有两个实例,然后ints是第二个实例的两个实例.对象是POD.
但是让我们说这个课程看起来像这样:
class B
{
public:
int FuncA( int x );
int FuncB( int y );
};
Run Code Online (Sandbox Code Playgroud)
这个类的对象在内存中看起来像什么?如果我用向量中的实例填充B向量?向量中有什么?我被告知非虚拟成员函数最终被编译为自由函数,这些函数与声明它们的类的实例完全无关(虚函数也是,但是对象存储带有函数指针的vtable) .访问限制仅仅是语义上的"人"级别.只有类(和vtable等)的数据成员实际上构成了对象的内存结构.
那么,类的对象B在内存中看起来又是什么样的呢?它是某种占位符价值吗?必须有东西,我可以拿对象的地址.它必须指向一些东西.无论是什么,编译器是否允许内联/优化这些对象并将方法调用视为正常的自由函数调用?如果我创建这些的向量并在每个对象上调用相同的方法,编译器是否可以消除向量并用一堆普通调用替换它?
我只是好奇.
我在static关键字上读了很多,我只找到了静态变量,静态函数,但是没有静态类的讨论,请你解释一下这个.
我在等你的回复.提前致谢.