小编peo*_*oro的帖子

静态链接只有一些库

在与GCC链接时,如何仅将某些特定库静态链接到我的二进制文件?

gcc ... -static ...尝试静态链接所有链接库,但我没有其中一些的静态版本(例如:libX11).

linker gcc static-libraries

99
推荐指数
6
解决办法
15万
查看次数

空引用是否可行?

这段代码是否有效(和定义的行为)?

int &nullReference = *(int*)0;
Run Code Online (Sandbox Code Playgroud)

这两个g ++以及铛++编译它没有任何警告,即使使用-Wall,-Wextra,-std=c++98,-pedantic,-Weffc++...

当然,引用实际上不是null,因为它无法访问(这意味着取消引用空指针),但我们可以通过检查其地址来检查它是否为null:

if( & nullReference == 0 ) // null reference
Run Code Online (Sandbox Code Playgroud)

c++ null reference language-lawyer

91
推荐指数
4
解决办法
10万
查看次数

C/C++:切换非整数

通常我需要根据非POD常量元素的值选择要做的事情,如下所示:

switch( str ) {
  case "foo": ...
  case "bar": ...
  default:    ...
}
Run Code Online (Sandbox Code Playgroud)

可悲的是switch只能用整数:error: switch quantity not an integer.

实现这样的事情最简单的方法是获得一系列ifs:

if( str == "foo" )      ...
else if( str == "bar" ) ...
else                    ...
Run Code Online (Sandbox Code Playgroud)

但是这个解决方案看起来很脏并且应该花费O(n),其中n是案例数,而在最坏的情况下,使用二进制搜索,这段代码可能花费O(log n).

使用一些数据结构(如Maps)可以获得表示字符串的整数(O(log n)),然后使用O(1)switch,或者可以通过if在右边嵌套s 来实现静态二进制排序但是,这些黑客攻击还需要大量编码,使一切变得更加复杂和难以维护.

最好的方法是什么?(快速,干净,简单,正如switch声明所述)

c c++ switch-statement

53
推荐指数
5
解决办法
3万
查看次数

为什么C-forkbombs不像bash那样工作?

如果我运行经典的bash forkbomb:

:(){ :&:&};:
Run Code Online (Sandbox Code Playgroud)

我的系统在几秒钟后挂起.

我试着用C编写一个forkbomb,这里是代码:

#include <unistd.h>

int main( )
{
    while(1) {
        fork();
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,系统的响应速度会降低,但我可以在按下时杀死该过程(即使在几分钟后)^C.


上面的代码与我发布的原始bash forkbomb不同:它更像是:

:( )
{
    while true
    do
        :
    done
}
Run Code Online (Sandbox Code Playgroud)

(我没有测试它;不知道它是否挂起系统).

所以我也尝试实现原始版本; 这里的代码:

#include <unistd.h>

inline void colon( const char *path )
{
    pid_t pid = fork( );
    if( pid == 0 ) {
        execl( path, path, 0 );
    }
}

int main( int argc, char **argv )
{
    colon( argv[0] );
    colon( …
Run Code Online (Sandbox Code Playgroud)

c c++ linux bash fork

51
推荐指数
1
解决办法
6767
查看次数

哈希表与平衡二叉树

当我需要在哈希表或平衡二叉树之间进行选择以实现集合或关联数组时,我应该考虑哪些因素?

language-agnostic algorithm tree hash data-structures

48
推荐指数
5
解决办法
4万
查看次数

GLIBCXX版本

如果我在我的机器上编译C++程序,并在另一台机器上运行它(使用较旧的软件),我得到:/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found.

实际上在我的系统上glibc更新(我得到了gcc-libs 4.5.1:libstdc ++.so.6.0.14)并strings /usr/lib/libstdc++.so.6 | grep GLIBCXX从中打印GLIBCXX_3.4GLIBCXX_3.4.14.相反,在另一个系统上,它只打印到GLIBCXX_3.4.8(我得到了libstdc ++.so.6.0.8).

所以我有几个问题:

  1. 为什么我的链接器将c ++二进制文件链接到libstdc ++版本GLIBCXX_3.4.9而不是GLIBCXX_3.4.14

  2. 如果我对libstdc ++版本编译我的二进制文件,GLIBCXX_3.4我想它几乎可以在任何地方运行.这会暗示任何问题吗?(例如:它会使用较旧的 - 因此更糟糕的算法实现吗?)

  3. 相反,我将我的程序静态链接到我的libstdc ++,我想它会在任何地方运行; 当然,二进制文件会更大(~1MB),任何其他优点/缺点?

  4. 我可以强制链接器将我的二进制文件链接到给定版本的libstdc ++吗?

c++ linux portability glibc

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

如何彻底删除可执行文件

我想尽可能多地剥离 - 在Linux上:一个ELF.我只想在那里运行它需要的东西.

我试过用strip:

strip --strip-all elf
Run Code Online (Sandbox Code Playgroud)

但它似乎没有做得好:nm仍然显示很多东西,二进制文件仍然很大.

我该怎么办?

linux executable gcc strip elf

35
推荐指数
3
解决办法
3万
查看次数

如何判断Haskell是缓存结果还是重新计算结果?

我注意到有时Haskell纯函数以某种方式被缓存:如果我用相同的参数调用函数两次,第二次立即计算结果.

  1. 为什么会这样?它是GHCI功能还是什么?
  2. 我能依靠这个(即:我能确定地知道是否会缓存一个函数值)?
  3. 我可以为某些函数调用强制或禁用此功能吗?

根据评论的要求,这是我在网上找到的一个例子:

isPrime a = isPrimeHelper a primes
isPrimeHelper a (p:ps)
    | p*p > a = True
    | a `mod` p == 0 = False
    | otherwise = isPrimeHelper a ps
primes = 2 : filter isPrime [3,5..]
Run Code Online (Sandbox Code Playgroud)

在运行它之前,我期望它非常慢,因为它一直在访问元素而primes没有显式地缓存它们(因此,除非这些值在某处缓存,否则它们需要重新计算很多次).但是我错了.

如果我设置+sGHCI(在每次评估后打印时间/内存统计数据)并评估表达式primes!!10000两次,这就是我得到的:

*Main> :set +s
*Main> primes!!10000
104743
(2.10 secs, 169800904 bytes)
*Main> primes!!10000
104743
(0.00 secs, 0 bytes)
Run Code Online (Sandbox Code Playgroud)

这意味着必须缓存至少primes !! 10000(或更好:整个primes列表,因为也primes!!9999不会花费时间).

caching haskell function

33
推荐指数
1
解决办法
2362
查看次数

C++可以编译内联函数指针吗?

假设我有一个functionProxy带有泛型参数的函数function并调用它operator():

template< typename Function > void functionProxy( Function function ) {
    function();
}
Run Code Online (Sandbox Code Playgroud)

传递给它的对象可能是:


int main( )
{
    functionProxy( Functor() );
    functionProxy( function );
    functionProxy( [](){ std::cout << "lambda!" << std::endl; } );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器将能够内联function中 …

c++ compiler-construction optimization inline function

27
推荐指数
1
解决办法
9959
查看次数

C++:隐藏规则背后的基本原理

C++中隐藏规则背后的基本原理是什么?

class A { void f(int); }
class B : public A { void f(double); } // B::f(int) is hidden
Run Code Online (Sandbox Code Playgroud)
  • 如果它是一个有意义的功能,我认为也应该可以隐藏功能而无需定义具有相同名称的新功能:如下所示:

    class B : public A { hide void f(double); }
    
    Run Code Online (Sandbox Code Playgroud)

    但这是不可能的.

  • 我不认为它简化了编译器的工作,因为编译器必须能够在显式使用指令时取消隐藏函数using:

    class B : public A { using A::f; void f(double); } // B::f(int) NOT hidden
    
    Run Code Online (Sandbox Code Playgroud)

那么,怎么会有隐藏规则呢?


嗯,所有三个答案似乎都很好,并且显示了隐藏规则的不同理由.我不确定我应该接受哪个答案.

c++ language-design hide rationale

25
推荐指数
3
解决办法
2175
查看次数