我写了一个小程序来粗略估计堆大小(我知道我可能只是用谷歌搜索它,但这似乎更有趣,我认为这将是一个简单的事情).
这是整个计划:
#include <stdio.h>
#include <stdlib.h>
void main()
{
unsigned long long alloc_size = 1024;
unsigned long long total = 0;
unsigned int i = 0;
void* p = 0;
while(alloc_size >= 16) {
p = malloc(alloc_size);
if (p) {
total += alloc_size;
i++;
printf("%u)\tAllocated %llu bytes\tTotal so far %llu\n", i, alloc_size, total);
alloc_size *= 2;
}
else {
alloc_size /= 2;
}
}
printf("Total alloctions: %llu bytes in %u allocations", total, i);
}
Run Code Online (Sandbox Code Playgroud)
我跑了这个,惊讶于两件事:
42) …Run Code Online (Sandbox Code Playgroud) I upgraded to the latest release of Google Test, and several of my tests no longer compiled. I've reduced it to this:
#include <gtest/gtest.h>
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
int main () {
const std::string foo = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const auto uppers = std::count_if(foo.begin(), foo.end(), std::isupper);
std::cout << "There are " << uppers << " capitals." << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
The Visual Studio 2019 (16.10.4) compiler with /std:c++latest complains:
1>Source.cpp(10,30): error C2672: 'std::count_if': no matching overloaded function …Run Code Online (Sandbox Code Playgroud) 每个游戏教程和游戏框架(甚至是相当新的XNA框架)都从一个永无止境的循环开始,该循环具有等效的DoEvents()以防止操作系统被锁定.
从非游戏角度来看,我觉得这种代码闻起来很时髦.
没有更好的选择吗?
--EDIT--
很多答案说每个程序基本上都是一个循环.没错,但我觉得循环应该由您的操作系统执行,而不是由您执行.只有操作系统具有以最佳方式分配其资源所需的所有信息.或者我在这里错过了一个重点?
我有一个旧的计算机视觉实验,它使用Video for Windows从连接到PC的相机中抓取帧.这是一个黑客,它使用VfW创建一个预览窗口,然后它从窗口DC执行GetDIBits.
我终于准备将它移植到DirectShow了.我的理解是我可以使用ISampleGrabber从视频捕获图中获取帧,但现在我读到了不推荐使用ISampleGrabber.
从视频Feed中抓取帧的非弃用方式是什么?我是否必须实现自己的DirectShow过滤器,它基本上与ISampleGrabber的功能相同?
对于我的产品中的多个文件,我需要在安装时将它们复制到两个不同的目标.例如:
C:\Program Files (x86)\My Company\My App\foo\xyzzy.txt
C:\Program Files (x86)\My Company\My App\bar\xyzzy.txt
Run Code Online (Sandbox Code Playgroud)
这两个xyzzy.txt副本是相同的.
我不希望在机柜中使用相同的文件副本.使用makecab,似乎在驾驶室中有重复的文件副本有效地使驾驶室的大小翻倍.相比之下,7zip设法包含第二个副本,几乎没有任何成本.
是否可以在(嵌入式)机柜中拥有每个文件的一个副本并将其安装到两个不同的目的地?如果是这样,你会如何在WiX 3.5中指定?
我假设有两个具有相同Id的File元素会违反XML的规则和/或WiX组件规则.另一方面,如果我有独特的文件元素,那么光会简单地将同一文件的两个副本放在机柜中吗?
首先,阅读有关解析和构建AST的内容?
如何为将构建AST并允许语法错误的语言(如SQL)创建解析器?
例如,对于"3 + 4*5":
+
/ \
3 *
/ \
4 5
Run Code Online (Sandbox Code Playgroud)
对于语法错误的"3 + 4*+",解析器会猜测用户的意思是:
+
/ \
3 *
/ \
4 +
/ \
? ?
Run Code Online (Sandbox Code Playgroud)
从哪儿开始?
SQL:
SELECT_________________
/ \ \
. FROM JOIN
/ \ | / \
a city_name people address ON
|
=______________
/ \
.____ .
/ \ / \
p address_id a id
Run Code Online (Sandbox Code Playgroud) language-agnostic compiler-construction algorithm abstract-syntax-tree
我试图声明一个变量,使其类型与我有成员函数指针的成员函数的返回类型相同.
class Widget {
public:
std::chrono::milliseconds Foo();
};
Run Code Online (Sandbox Code Playgroud)
例如,给定一个成员函数的指针fn,它指向Widget::Foo的,我怎么会声明一个变量blah,使得它得到Widget::Foo的返回类型(std::chrono::milliseconds)?
我发现从使用博客中的一些有前途的指导result_of,从<type_traits>沿decltype,但我似乎无法得到它的工作.
auto fn = &Widget::Foo;
Widget w;
std::result_of<decltype((w.*fn)())>::type blah;
Run Code Online (Sandbox Code Playgroud)
这种方法对我有意义,但VC++ 2013不喜欢它.
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xrefwrap(58): error C2064: term does not evaluate to a function taking 0 arguments
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xrefwrap(118) : see reference to class template instantiation 'std::_Result_of<_Fty,>' being compiled
with
[
_Fty=std::chrono::milliseconds (__cdecl Widget::* )(void)
]
scratch.cpp(24) : see …Run Code Online (Sandbox Code Playgroud) 如果您使用带有 CREATE_NEW_CONSOLE 标志的 CreateProcess,则新进程会将其标准输入、输出和错误句柄定向到新控制台窗口。如果要覆盖 I/O 流,可以通过设置 STARTUPINFO 字段 hStdOutput、hStdInput 和 hStdError 中的句柄并设置标志 STARTF_USESTDHANDLES 来实现。
但是如果您只想覆盖一个句柄怎么办?例如,我可能希望将 stderr 重定向到一个文件,同时将 stdout 和 stdin 连接到新的控制台窗口。
STARTF_USESTDHANDLES 标志告诉 CreateProcess 替换所有句柄,而不是将它们连接到新控制台窗口的句柄。所以看起来我们必须提供所有三个句柄。显然我可以将 hStdError 设置为日志文件的句柄,但是 hStdInput 和 hStdOutput 应该使用什么值?
我尝试使用 NULL,它似乎适用于 Windows 8.1,但不适用于 Windows 7。
我还考虑过首先创建一个控制台窗口,然后使用新控制台窗口缓冲区的句柄调用 CreateProcess(并省略 CREATE_NEW_CONSOLE 标志)。不幸的是,父进程也是一个控制台应用程序,似乎一个控制台应用程序无法创建第二个控制台窗口。
我需要分割一大堆3D点(使用C++).这些点作为二进制浮点数组存储在HDD上,文件通常大于10GB.我需要将集合划分为大小小于1GB的较小子集.子集中的点应该仍然具有相同的邻域,因为我需要对数据执行某些算法(例如,对象检测).
我以为我可以使用KD-Tree.但是,如果我无法将所有点加载到RAM中,如何有效地构建KD-Tree?也许我可以将文件映射为虚拟内存.然后我可以保存指向属于某个段的每个3D点的指针并将其存储在KD树的节点中.那会有用吗?还有其他想法吗?
谢谢您的帮助.我希望你能解决这个问题:D
通过K&R ansi C编程语言书(第二版),第82页,给出了编程文件/文件夹布局的示例.
我不明白的是,虽然calc.h被列入main(使用功能),getop.c(getop的定义)和stack.c(push和pop的定义),它不会纳入getch.c,即使getch与ungetch被定义在那里.
c++ ×4
algorithm ×2
c ×2
winapi ×2
3d ×1
console ×1
decltype ×1
directshow ×1
googletest ×1
kdtree ×1
malloc ×1
stdio ×1
template-argument-deduction ×1
type-traits ×1
vfw ×1
wix ×1
wix3.5 ×1