- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有以下用非托管 C 代码编写的程序:
#include <Windows.h>
#include <tchar.h>
const TCHAR g_szClassName[] = _T("SkeletonAppWindowClass");
LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam);
ATOM RegisterWCEX(HINSTANCE hInstance);
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd);
ATOM RegisterWCEX(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
ZeroMemory(&wcex, sizeof(WNDCLASSEX));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.hbrBackground = (HBRUSH)COLOR_WINDOW;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hIcon =
wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wcex.hInstance = hInstance;
wcex.lpfnWndProc = WindowProc;
wcex.lpszClassName = g_szClassName;
return RegisterClassEx(&wcex);
}
BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam)
{
HFONT hfDefault = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
SendMessage(hWnd, WM_SETFONT, (WPARAM)hfDefault, 0L);
return TRUE;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
static HWND hButton;
switch (Msg)
{
case WM_CREATE:
hButton = CreateWindow(_T("BUTTON"), _T("Say Hi"), WS_VISIBLE | WS_CHILD, 130, 230, 70, 20, hWnd, NULL, GetModuleHandle(NULL), NULL);
break;
case WM_COMMAND:
if ((HWND)lParam == hButton)
{
MessageBox(0, _T("Hello World!"), _T("Information"), MB_OK | MB_ICONINFORMATION);
}
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
return 0;
}
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd)
{
HWND hWnd;
MSG Msg;
RegisterWCEX(hInstance);
hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, g_szClassName, _T("Simple Window"), WS_VISIBLE | WS_SYSMENU, 100, 100, 350, 370, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, SW_SHOW);
EnumChildWindows(hWnd, EnumChildProc, 0L);
UpdateWindow(hWnd);
while (GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
它所做的只是创建一个简单的窗口,单击该窗口会弹出一个消息框,上面写着“Hello World!”
此程序在 /O1
(最小化空间)优化的 Release模式下大小为 10KB。
然后,当我在 C# 中创建“Windows 窗体应用程序”并在窗体上创建一个按钮时,其事件处理程序是这样的:
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello World", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
在 Release模式下编译时,C# 可执行文件的大小仅为 8KB。这是违反直觉的;我原以为非托管程序会更紧凑。
问题是我编写 C 程序的方式,还是我没有考虑到其他问题?
最佳答案
您程序的大部分功能都包含在您链接到的库中。这些库不会影响程序的大小,除非它们需要调用更多函数来执行相同的行为。你的例子就是这种情况。与采用单个函数调用且无需配置的 .NET 应用程序相比,Windows 库需要大量设置和调用 API 才能生成对话框。编译后程序的大小与链接和调用库的外部 API 的指令数有关。非托管程序比使用 .NET 的程序有更多的指令。
关于c# - 为什么使用 .NET 框架的程序比非托管代码中的相同程序小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32360399/
我有一个用 C 编写的多线程合并排序程序,以及一个使用 0、1、2 或 4 个线程对其进行基准测试的程序。我还用 Python 编写了一个程序来进行多项测试并汇总结果。 奇怪的是,当我运行 Pytho
这个问题在这里已经有了答案: Why is my Rust program slower than the equivalent Java program? (1 个回答) 关闭 5 年前。 我用
关于编译为 JavaScript 的语言的开发,我也在考虑以 C++ 为目标,以便在需要时生成更快的程序。我的计划是使用 std::vectors 来保存我的语言的动态数组。重复填充一个大数组将是一个
今天,我正在阅读一些用 FORTRAN 77 编写的非常流行的数值库中的代码,例如 QUADPACK ( last updated in 1987 ),我想知道除了大量的代码之外,是否有任何理由不在
我的 Java 程序目前遇到了一个奇怪的行为: 该程序是一个 JavaFX 桌面应用程序,它使用本地 Selenium 独立服务器打开 Web 应用程序,进行一些输入并下载 Excel 文件。它读取
我为我已经完成并提交的 OS 类作业写了这篇文章。我昨天发布了这个问题,但由于“学术诚信”规定,我在提交截止日期之后才将其取消。 目标是学习如何使用临界区。有一个 data 数组,其中包含 100 个
我查看了 Rust 程序使用了多少 RAM(top 命令的 RES 列),我想知道为什么它们使用这么多内存。 这是一个例子: use std::io; fn main() { println!
我是一名优秀的程序员,十分优秀!