在与GCC链接时,如何仅将某些特定库静态链接到我的二进制文件?
gcc ... -static ...
尝试静态链接所有链接库,但我没有其中一些的静态版本(例如:libX11).
这段代码是否有效(和定义的行为)?
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) 通常我需要根据非POD常量元素的值选择要做的事情,如下所示:
switch( str ) {
case "foo": ...
case "bar": ...
default: ...
}
Run Code Online (Sandbox Code Playgroud)
可悲的是switch
只能用整数:error: switch quantity not an integer
.
实现这样的事情最简单的方法是获得一系列if
s:
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
声明所述)
如果我运行经典的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++程序,并在另一台机器上运行它(使用较旧的软件),我得到:/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.4
到GLIBCXX_3.4.14
.相反,在另一个系统上,它只打印到GLIBCXX_3.4.8
(我得到了libstdc ++.so.6.0.8).
所以我有几个问题:
为什么我的链接器将c ++二进制文件链接到libstdc ++版本GLIBCXX_3.4.9
而不是GLIBCXX_3.4.14
?
如果我对libstdc ++版本编译我的二进制文件,GLIBCXX_3.4
我想它几乎可以在任何地方运行.这会暗示任何问题吗?(例如:它会使用较旧的 - 因此更糟糕的算法实现吗?)
相反,我将我的程序静态链接到我的libstdc ++,我想它会在任何地方运行; 当然,二进制文件会更大(~1MB),任何其他优点/缺点?
我可以强制链接器将我的二进制文件链接到给定版本的libstdc ++吗?
我想尽可能多地剥离 - 在Linux上:一个ELF.我只想在那里运行它需要的东西.
我试过用strip
:
strip --strip-all elf
Run Code Online (Sandbox Code Playgroud)
但它似乎没有做得好:nm
仍然显示很多东西,二进制文件仍然很大.
我该怎么办?
我注意到有时Haskell纯函数以某种方式被缓存:如果我用相同的参数调用函数两次,第二次立即计算结果.
根据评论的要求,这是我在网上找到的一个例子:
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
没有显式地缓存它们(因此,除非这些值在某处缓存,否则它们需要重新计算很多次).但是我错了.
如果我设置+s
GHCI(在每次评估后打印时间/内存统计数据)并评估表达式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
不会花费时间).
假设我有一个functionProxy
带有泛型参数的函数function
并调用它operator()
:
template< typename Function > void functionProxy( Function function ) {
function();
}
Run Code Online (Sandbox Code Playgroud)
传递给它的对象可能是:
一个仿函数:
struct Functor {
void operator()() const {
std::cout << "functor!" << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)功能:
void function( ) {
std::cout << "function!" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)一个(C++ 0x)lambda函数:
[](){ std::cout << "lambda!" << std::endl; }
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++中隐藏规则背后的基本原理是什么?
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)那么,怎么会有隐藏规则呢?
嗯,所有三个答案似乎都很好,并且显示了隐藏规则的不同理由.我不确定我应该接受哪个答案.