相关疑难解决方法(0)

静态与Malloc

块范围中的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一般更优选吗?

c malloc memory-management

7
推荐指数
1
解决办法
5049
查看次数

静态库中的Singleton类

假设我在静态库中有一个单例类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

7
推荐指数
1
解决办法
2309
查看次数

使用可分配数组的性能损失

我有一个 Fortran90 程序 (Packmol),直到它是通过静态内存分配实现的。

我将代码更改为使用动态分配,以便在开始时分配所有数组。在某些示例中,我的性能损失了 400%。

然后,我验证了即使数组的大小与我使用静态分配时的大小相同,问题仍然存在。也就是说,如果我将分配更改为 类似 That 的内容,则足以导致性能损失。当然,当所有需要动态分配的数组都这样做时,大约有 30 个。 double precision :: x(1000) double precision, allocatable :: x(:) allocate(x(1000))

有没有办法以更有效的方式分配数组以减少性能损失?或者有人有不同的建议?

非常感谢。

编辑:不知何故,问题得到了解决。动态版本现在只比静态版本慢一点,这是预期的。我真的不知道是什么导致了之前的重大放缓。

arrays fortran

5
推荐指数
1
解决办法
1885
查看次数

如何添加静态断言来检查变量是否是静态的?

我有一个仅适用于静态局部变量的宏(因为它使用内联汇编表示法来提取有关变量的数据)。我需要一种方法来强制宏的输入确实是静态局部变量:

正确的:

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++)。

c static static-assert

4
推荐指数
1
解决办法
1107
查看次数

const变量和静态变量之间有什么区别?我应该选择哪个?

我从RFC 246中知道这一点:

  • 常量声明常量值.它们代表一个值,而不是内存地址.这是人们可以达到的最常见的事情,并且static几乎在所有情况下我们今天都会知道它.
  • 静态声明全局变量.这些代表一个内存地址.它们很少使用:主要用例是全局锁,全局原子计数器以及与传统C库的接口.

当我试图维护一张桌子时,我不知道两者之间究竟有什么不同.

我应该选择哪一个?

static const rust

4
推荐指数
3
解决办法
1403
查看次数

是否在存储在堆栈中的函数内声明了const数组?

如果这是在一个函数中声明的,它会在堆栈中声明吗?(它是const是让我惊讶的原因)

void someFunction()
{

     const unsigned int actions[8] = 
     {       e1,
             e2,
             etc...
     };
 }
Run Code Online (Sandbox Code Playgroud)

c++ stack

3
推荐指数
1
解决办法
448
查看次数

struct里面的静态变量在哪里?

在C中,如果我在局部结构中声明一个静态变量,静态变量放在哪里?由于结构在堆栈中,静态变量是否也在堆栈中?

c static struct

2
推荐指数
1
解决办法
2440
查看次数

C中静态变量的内存分配

可能重复:
存储静态变量的位置(在C/C++中)?

我已经读过,初始化的所有全局变量都将在初始化数据段上分配空间,并且所有未初始化的静态和全局变量都被初始化为0,并在BSS上分配.如果有以下定义,

static int i = 0;
Run Code Online (Sandbox Code Playgroud)

在哪里i分配空间?它是否在初始化数据段上,因为它i是初始化的,还是在BSS上,因为它的值i是0?

c

2
推荐指数
1
解决办法
8860
查看次数

成员静态函数内的 C++ 静态变量

一般来说,我想知道成员函数的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)

通过上面的代码,声明为有优势SomeMapstatic?(我希望它只初始化一次。)

c++ static boost

2
推荐指数
1
解决办法
2450
查看次数

为什么局部静态变量是 BSS 段的一部分?

静态内存布局的 BSS 部分[应该]用于“未初始化的全局变量”或“全局变量设置为 0”。

\n

我正在运行一些测试,突然注意到局部静态变量也在增加 BSS 段的大小。

\n

例子 :-

\n

在任何静态变量之前

\n
int main (int argc, char argv[])\n{\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n
data/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\n
Run Code Online (Sandbox Code Playgroud)\n

静态变量之后

\n
int main (int argc, char *argv[])\n{\n    static int a, b, c;\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n
data/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\n
Run Code Online (Sandbox Code Playgroud)\n

这些变量肯定不是全局变量,那为什么BSS段会增加呢?或者“未初始化的全局变量的段”的想法不完全正确?

\n

目前我使用的是 …

c c++ gcc

2
推荐指数
1
解决办法
1818
查看次数