- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在装有 GCC 4.8.2 的 Windows 8.1、Intel i7-3517U 64 位笔记本电脑上测试这个简单的 C++ 代码。
#include<iostream>
using namespace std;
int main(int argc, char **argv){
cout << "This test code will simply display any arguments passed." << endl ;
for(int i=0; i<argc; i++){
cout << argv[i] << endl ;
}
return 0 ;
}
令人惊讶的是,编译后的可执行文件竟然是5905KB。出于好奇,我尝试在 Linux Fedora 20 64 位机器上使用相同的 GCC 版本编译相同的文件。可执行文件只有 9KB。
在使用 g++ -Ox -o fileWithOx.exe file.cpp
(x=1,2,3,s) 进行各种优化后,Windows 可执行文件的大小几乎相同。在做了一些研究之后,关注 MinGW's advise我尝试使用 strip g++ -s -o fileWithStrip.exe file.cpp
在不调试信息的情况下编译它们,但可执行文件仍然 597KB 大。
而另一方面,对于相同的选项,Linux 可执行文件只有 6-13KB。
做一些实验,some more research & stack overflowing ,我几乎确信巨大的大小是由于 iostream 链接到许多其他头文件和/或生成一些初始化代码。
但我怀疑在 Windows 和 Linux 中都使用 iostream。那为什么大小相差这么大呢?我知道 Windows 和 Linux 可执行文件的工作方式不同。 但是大了655倍,是不是有点极端了?
最佳答案
差异可能不是由于编译,而是链接版本阶段。
首先尝试只编译,使用 -c
停止命令,例如g++ -c code.cpp
在类 Unix 中,并在您的 Windows 环境中找到等效的标志。然后比较目标文件,它们的大小应该差不多。这些目标文件(.o
扩展名)仅包含您的代码到机器代码的翻译。大小可能不同,比如可能是 2 或 3 倍,但这无关紧要。
发生的事情是您的 Windows 编译器可能在某些库上使用了静态链接,因此可执行文件包含您在库中使用的代码。在类 Unix 上,编译器可能会动态链接所有内容,这表示库将在运行时加载,而不包含在可执行文件中。
请参阅您的编译器文档以了解如何强制执行静态/动态链接。您也应该知道,某些环境可能不提供这两种库...
关于c++ - 对于相同的 c++ 源文件,其 gcc 可执行文件在 Windows 中比在 Linux 中大 655 倍。为什么差别这么大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21285335/
我们在 RedHat 中使用 Postgres 9.2。我们有一个类似于以下的表: CREATE TABLE BULK_WI ( BULK_ID INTEGER NOT NULL, U
根据我的计算,将浮点值转换为计算机存储的二进制值(符号、指数、尾数格式),在 32 位中,1 位用于符号,8 位用于指数。 所以只剩下 23 位来表示数字。 所以我认为具有正确行为的浮点值范围仅为 0
我有一个像这样的临时表: CREATE TABLE `staging` ( `created_here_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTA
下面是我的 HTML: Fact Sheet Facilities and Administrative (F&A) Cost Agreem
我想知道为什么 .add(i, E) 是 O(n) 而 .get(i) 是 O(1)?是不是因为 n 元素在插入后必须向右移动? 最佳答案 记住大 O 表示法显示问题的数量级而不是最佳情况解决方案..
我在装有 GCC 4.8.2 的 Windows 8.1、Intel i7-3517U 64 位笔记本电脑上测试这个简单的 C++ 代码。 #include using namespace std;
我是一名优秀的程序员,十分优秀!