块范围中的static关键字与使用malloc相比有什么优势?
例如:
功能A:
f() {
static int x = 7;
}
Run Code Online (Sandbox Code Playgroud)
功能B:
f() {
int *x = malloc(sizeof(int));
if (x != NULL)
*x = 7;
}
Run Code Online (Sandbox Code Playgroud)
如果我正确理解这一点,两个程序都会创建一个存储在堆上的整数7.在A中,变量在主方法执行之前在某个永久存储器的最开始创建.在B中,一旦调用函数,就在现场分配内存,然后在指针指向的位置存储7.在什么类型的情况下,您可以使用一种方法而不是另一种方法?我知道你不能在函数A中释放x,所以不会使B一般更优选吗?
假设我在静态库中有一个单例类S,这可以与其他动态库D1 D2 D3链接,
所以根据我的理解,类S将在每个D1,D2和D3中有一个单独的实例,即使它不是单例(如全局)也是如此
有没有办法防止S类的多个副本?我不能将单例S放在另一个动态库中.
Executable
/ | \ \
D1 D2 D3 D4
| | |
S S S
Run Code Online (Sandbox Code Playgroud)
编辑:单例S在一个单独的静态库中,分别与D1 D2 D3 ...链接.
单例在堆中分配,只有指针是静态的
static s::instance()
{
static smart_ptr<S> ptr = NULL;
if(ptr == NULL) ptr = new S;
return ptr;
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:
我做了一个简单的测试用例来检查出来这是一个示例makefile(用.so替换.d)我做了检查,我在Ubuntu和Cygwin上检查过,两个g ++编译器和行为都不同.cygwin创建了2个不同的对象但是ubuntu创建了1个对象
all: dynamic1 dynamic2 main
static: static.cpp
g++ -c -fPIC static.cpp -o obj/static.o
ar rvs lib/static.a obj/static.o
dynamic1: static dynamic1.cpp
g++ -fPIC -shared dynamic1.cpp lib/static.a -o lib/libdynamic1.dll
dynamic2: static dynamic2.cpp
g++ -fPIC -shared dynamic2.cpp lib/static.a …Run Code Online (Sandbox Code Playgroud) c++ singleton design-patterns static-libraries dynamic-library
我有一个 Fortran90 程序 (Packmol),直到它是通过静态内存分配实现的。
我将代码更改为使用动态分配,以便在开始时分配所有数组。在某些示例中,我的性能损失了 400%。
然后,我验证了即使数组的大小与我使用静态分配时的大小相同,问题仍然存在。也就是说,如果我将分配更改为
类似
That 的内容,则足以导致性能损失。当然,当所有需要动态分配的数组都这样做时,大约有 30 个。
double precision :: x(1000)
double precision, allocatable :: x(:)
allocate(x(1000))
有没有办法以更有效的方式分配数组以减少性能损失?或者有人有不同的建议?
非常感谢。
编辑:不知何故,问题得到了解决。动态版本现在只比静态版本慢一点,这是预期的。我真的不知道是什么导致了之前的重大放缓。
我有一个仅适用于静态局部变量的宏(因为它使用内联汇编表示法来提取有关变量的数据)。我需要一种方法来强制宏的输入确实是静态局部变量:
正确的:
func f()
{
static int x;
my_macro(x);
}
Run Code Online (Sandbox Code Playgroud)
不正确:
func f()
{
int x;
my_macro(x);
}
Run Code Online (Sandbox Code Playgroud)
我使用 GCC 来处理 C(没有 C++)。
我从RFC 246中知道这一点:
- 常量声明常量值.它们代表一个值,而不是内存地址.这是人们可以达到的最常见的事情,并且
static几乎在所有情况下我们今天都会知道它.- 静态声明全局变量.这些代表一个内存地址.它们很少使用:主要用例是全局锁,全局原子计数器以及与传统C库的接口.
当我试图维护一张桌子时,我不知道两者之间究竟有什么不同.
我应该选择哪一个?
如果这是在一个函数中声明的,它会在堆栈中声明吗?(它是const是让我惊讶的原因)
void someFunction()
{
const unsigned int actions[8] =
{ e1,
e2,
etc...
};
}
Run Code Online (Sandbox Code Playgroud) 在C中,如果我在局部结构中声明一个静态变量,静态变量放在哪里?由于结构在堆栈中,静态变量是否也在堆栈中?
可能重复:
存储静态变量的位置(在C/C++中)?
我已经读过,初始化的所有全局变量都将在初始化数据段上分配空间,并且所有未初始化的静态和全局变量都被初始化为0,并在BSS上分配.如果有以下定义,
static int i = 0;
Run Code Online (Sandbox Code Playgroud)
在哪里i分配空间?它是否在初始化数据段上,因为它i是初始化的,还是在BSS上,因为它的值i是0?
一般来说,我想知道成员函数的static局部变量存储在哪里?即,如果static变量仅在static函数内部使用,则该变量是否仅初始化一次?
请参考下面的代码
std::string const CONST1 = "const1";
std::string const CONST2 = "const2";
std::string const CONST3 = "const3";
class Test
{
public:
static const std::vector<std::string> GetSomeMap();
}
const std::vector<std::string> Test::GetSomeMap()
{
static std::vector<std::string> SomeMap = boost::assign::list_of(CONST1)(CONST2)(CONST3);
return SomeMap;
}
Run Code Online (Sandbox Code Playgroud)
通过上面的代码,声明为有优势SomeMap吗static?(我希望它只初始化一次。)
静态内存布局的 BSS 部分[应该]用于“未初始化的全局变量”或“全局变量设置为 0”。
\n我正在运行一些测试,突然注意到局部静态变量也在增加 BSS 段的大小。
\n例子 :-
\n在任何静态变量之前
\nint main (int argc, char argv[])\n{\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\ndata/repos/e-c \n\xe2\x9d\xaf size a.out \n text data bss dec hex filename\n 1418 544 8 1970 7b2 a.out\nRun Code Online (Sandbox Code Playgroud)\n静态变量之后
\nint main (int argc, char *argv[])\n{\n static int a, b, c;\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\ndata/repos/e-c \n\xe2\x9d\xaf !s\nsize a.out \n text data bss dec hex filename\n 1418 544 16 1978 7ba a.out\nRun Code Online (Sandbox Code Playgroud)\n这些变量肯定不是全局变量,那为什么BSS段会增加呢?或者“未初始化的全局变量的段”的想法不完全正确?
\n目前我使用的是 …