小编Jos*_*osh的帖子

C动态分配速度问题

我正在使用此代码动态创建一个二维数组:

char **FileTables;
int rows = 1000;
int i;

FileTables = (char**)malloc(rows * sizeof(char));
for (i = 0; i < rows; i++) {
    FileTables[i] = (char*)malloc(256 * sizeof(char));
}
Run Code Online (Sandbox Code Playgroud)

问题是1000行,可能会有更多,分配所有内存需要几秒钟.这样做有更快/更好的方法吗?

编辑:除了明显更简单的代码之外,使用这些方法之一是否有优势?

char **FileTables;
int rows = 1000;
int i;

FileTables = malloc(rows * sizeof(char*));
FileTables[0] = malloc(rows * 256 * sizeof(char));
for (i = 0; i < rows; i++) {
    FileTables[i] = FileTables[0] + i * 256;
}
Run Code Online (Sandbox Code Playgroud)

和..

char (*FileTables)[256];
int rows = 1000;

FileTables = malloc(rows * sizeof(*FileTables)); …
Run Code Online (Sandbox Code Playgroud)

c arrays malloc performance dynamic

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

C++容器性能问题

什么会有更好的性能,一个stl向量,或者每次我想要添加内容时都重新分配的动态数组?

使用vectors :: iterator会比在数组上使用for循环更快吗?

如果有人能解释原因,那就太好了.

c++ algorithm performance containers

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

C++ WM_NCCALCSIZE 未发送

我试图将编辑控件中的文本垂直居中,经过一些研究后我发现我必须处理 WM_NCCALCSIZE 消息。因此,我对编辑控件进行了子类化,但从未发送 WM_NCCALCSIZE 消息。

难道我做错了什么?

编辑:

所以我正在WM_NCCALCSIZE很好地处理消息,并且我有一个通过传递WS_EX_CLIENTEDGE到创建的 3d 边框CreateWindowEx。但是,如果我通过终止主题服务来禁用 Windows 主题,则处理消息的控件上的边框就会消失WM_NCCALCSIZE。另一个不处理WM_NCCALCSIZE消息的控件仍然像平常一样具有边框。

所以我假设我应该做一些事情来WM_NCCALCSIZE让我保持边界?如果是这样怎么办?如果没有办法恢复边界吗?

c++ windows api edit subclass

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

字符串匹配算法

说我有3个字符串.再多1个字符串.
有没有一种算法可以让我找到前3个字符串中哪一个最匹配第4个字符串?
没有一个字符串会完全匹配,我只是想找到最接近的匹配.
如果算法已经存在于STL中,那就太好了.

提前致谢.

c++ string algorithm stl

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

在将ASCII字符串传递给Windows API函数之前将其转换为UTF-16

在我目前的项目中,我一直在使用宽字符(utf16).但是由于我用户的唯一输入将是一个url,无论如何都必须结束ascii,另外还有一个字符串,我正在考虑将整个程序切换为ascii.

我的问题是,在将字符串传递给Windows API函数之前,将字符串转换为utf16有什么好处吗?

在网上做了一些研究之后,如果你不在Windows上使用UTF-16,似乎有很多人推荐这个.

c++ windows unicode winapi encoding

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

Opengl glScalef重置性能

glScalef(0.5f, 0.5f, 0);
// do some things
glScalef(2.0f, 2.0f, 0);
Run Code Online (Sandbox Code Playgroud)

要么..

glPushMatrix();
glScalef(0.5f, 0.5f, 0);
// do some things
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)

哪个更好,性能更好?

opengl performance

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

C++ Win32 API使用进度条删除文件

使用windows api,有没有办法删除一个大文件(比方说1gb +),并以某种方式监控进度?我确定它可能但我不知道从哪里开始..

编辑:应该更具体,我想将文件移动到回收站,并显示类似于探索的进度条,虽然我可能想要控制台中的进度条或其他东西,所以我不想要一个精确的副本.

编辑2:Yeaah猜测它是即时的,应该在我提出问题之前进行测试.无论如何只是关闭这个问题?

c++ api winapi file delete-file

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

在对话框中的组合框上获取焦点

我试图在对话框中的 ComboBox 控件上使用 GetFocus(),但由于某种原因它不起作用。
即使我使用 SetFocus() 函数设置焦点,它也不起作用,但看起来它具有键盘焦点。

SetFocus(hKeysComboBox);
if (GetFocus() == hKeysComboBox) // This is false
Run Code Online (Sandbox Code Playgroud)

也许是因为它在一个对话框中?我不知道,这看起来很简单。

c++ windows winapi

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

在Windows中不使用Unicode有什么缺点?

在Windows上不使用Unicode有什么缺点?

通过Unicode,我的意思WCHAR是广泛的API函数.(CreateWindowW,MessageBoxW等)

不使用这个会遇到什么问题?

c c++ windows unicode winapi

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

WM_TIMER动画闪烁

好吧我正在使用一个时间为50毫秒的计时器来动画一些移动的文本(技术上它在文本之间滚动).
问题是,如果你仔细观察,你可以看到文字闪烁,并且id不喜欢闪烁..

所以我对动画不是那么好但是我能做些什么来减少闪烁?也许更快的过去时间?或者我应该甚至使用计时器吗?

编辑:
所以我试图实现双缓冲,我显然做了一些事情.

这是没有双缓冲的代码,这个工作正常,但有点闪烁.

void PaintScrollingText(ScrollingText *Settings, WPARAM wParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    HANDLE hOldFont;
    RECT rect;

    hdc = wParam ? (HDC)wParam : BeginPaint(Settings->hWnd, &ps);

    hOldFont = SelectObject(hdc, Settings->hFont);

    SetTextColor(hdc, Settings->crForeGnd);
    SetBkColor(hdc, Settings->crBackGnd);

    GetClientRect(Settings->hWnd, &rect);

    rect.right -= Settings->txt1XOffset;
    DrawText(hdc, Settings->szText1, -1, &rect, DT_RIGHT);

    rect.right += Settings->txt1XOffset - Settings->txt2XOffset;
    DrawText(hdc, Settings->szText2, -1, &rect, DT_RIGHT);

    SelectObject(hdc, hOldFont);

    if (!wParam) EndPaint(Settings->hWnd, &ps);
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码,带有双缓冲.

void PaintScrollingText(ScrollingText *Settings, WPARAM wParam) …
Run Code Online (Sandbox Code Playgroud)

c++ windows animation timer double-buffering

0
推荐指数
1
解决办法
824
查看次数

ShowCaret和SetCaretPos失败并出现ERROR_ACCESS_DENIED

什么可能导致ShowCaretSetCaretPos失败ERROR_ACCESS_DENIED

我正在创建插入符号WM_CREATE并显示插入符号WM_COMMAND.我检查并CreateCaret正在成功执行.

它们应该在同一个线程中运行.

我在调用之前使用SetScrollInfo并更新了我的窗口内容.但我不认为这会导致失败..InvalidateRectShowCaretShowCaret

相关代码:

#define CHAR_WIDTH  7
#define CHAR_HEIGHT 12

case WM_CREATE:
    CreateCaret(hWnd, NULL, CHAR_WIDTH, 2);
    UpdateScrollbar(hWnd); // calls SetScrollInfo. initially nMin and nMax are both 0
    return 0;

case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case IDM_OPENFILE:
        if (DoOpenFile(hWnd))
        {
            InvalidateRect(hWnd, NULL, TRUE);
            UpdateScrollbar(hWnd);

            if (SetCaretPos(CHAR_WIDTH * 12, CHAR_HEIGHT - 1) == 0)
            {
                char ss[33];
                sprintf_s(ss, "DEBUG 2: %d\n", GetLastError());
                OutputDebugString(ss);
            }

            if …
Run Code Online (Sandbox Code Playgroud)

c++ winapi

0
推荐指数
1
解决办法
700
查看次数

在GetMessage循环中没有收到WM_COMMAND

有人可以解释为什么我从未WM_COMMAND在GetMessage循环中收到消息吗?
我已经检查过并且WndProc正在接收WM_COMMAND消息,所以我很困惑为什么这不起作用.

while (GetMessage(&msg, NULL, 0, 0) != 0)
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);

    if (msg.message == WM_COMMAND)
    {
        // This never happens:
        MessageBox(NULL, "WM_COMMAND", "WM_COMMAND", MB_OK);
    }
}
Run Code Online (Sandbox Code Playgroud)

操作系统:Windows 8

c++ winapi

0
推荐指数
1
解决办法
370
查看次数