我只是好奇,为什么在IEEE-754
任何非零浮点数除以零时会产生无穷大的值?从数学角度来看,这是无稽之谈.所以我认为这个操作的正确结果是NaN.
如果x是实数,则当x = 0时,不定义函数f(x)= 1/x.例如,如果IEEE-754
生成NaN
值,则不为任何负数定义函数sqrt,并为sqrt(-1.0f)定义函数sqrt .但1.0f/0是Inf
.
但由于某些原因,事实并非如此IEEE-754
.必须有一个原因,可能是一些优化或兼容性原因.
那有什么意义呢?
再次我与矢量.我希望我不会太讨厌.我有这样的结构:
struct monster
{
DWORD id;
int x;
int y;
int distance;
int HP;
};
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个矢量:
std::vector<monster> monsters;
Run Code Online (Sandbox Code Playgroud)
但现在我不知道如何搜索向量.我想在矢量中找到怪物的ID.
DWORD monster = 0xFFFAAA;
it = std::find(bot.monsters.begin(), bot.monsters.end(), currentMonster);
Run Code Online (Sandbox Code Playgroud)
但显然它不起作用.我想只通过结构的.id元素进行迭代,我不知道该怎么做.非常感谢帮助.谢谢 !
我CMake
用来生成unix makefile.之后,我使用make
实用程序编译项目.问题是我看不到任何警告!例如,这会导致干净的构建而不会发出警告:
#include <iostream>
class Foo
{
int first;
int second;
public:
Foo(int a, int b)
: second(a) // invalid initialization order
, first(b)
{
}
};
int main(int argc, char** argv)
{
int unused; // unused variable
int x;
double y = 3.14159;
x = y; // invalid cast
Foo foo(1,2);
std::cout << y << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
未使用的变量和有损变量 - 没有警告!我的CMakeLists.txt
档案很简约:
cmake_minimum_required(VERSION 2.8)
add_executable(main main.cpp)
Run Code Online (Sandbox Code Playgroud)
当我运行cmake
然后make
我的输出看起来像这样:
[100%] Building …
Run Code Online (Sandbox Code Playgroud) 我希望每次成功构建项目时都会启动测试.如果某些测试被破坏,我希望我的构建也被打破.默认情况下,我需要通过运行ctest
命令手动运行测试.CTest实际上可以构建项目,但我使用调用make
来构建源代码的IDE .而且make
不会运行测试.
我将此命令添加到我的根CMakeLists.txt文件,但它不起作用.
add_custom_command(OUTPUT tests.txt
POST_BUILD
COMMAND ctest --output-on-failure)
Run Code Online (Sandbox Code Playgroud)
CMake不会返回任何错误,一切都很好,但我的自定义命令不会调用.如何在CMake中每次成功构建后运行一些东西?
更新:
我的最终解决方案是这个功能:
macro(add_unit_test target target_test)
set(UNIT_TEST_TARGETS ${UNIT_TEST_TARGETS} ${target_test} PARENT_SCOPE)
add_test(target ${CMAKE_CURRENT_BINARY_DIR}/${target_test})
endmacro(add_unit_test)
Run Code Online (Sandbox Code Playgroud)
它调用add_test
并记住列表中的测试目标.此功能添加的项目中的每个测试.在根CMakeLists.txt我有这个代码:
add_custom_target( all_tests ALL
DEPENDS ${UNIT_TEST_TARGETS}
)
add_custom_command(TARGET all_tests
COMMENT "Run tests"
POST_BUILD COMMAND ctest ARGS --output-on-failure
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
Run Code Online (Sandbox Code Playgroud)
它创建依赖于项目中所有单元测试的自定义目标.自定义命令all_tests
在构建目标后运行.
我编写用正则表达式解析文本的程序.应从用户处获得正则表达式.我希望使用glob语法进行用户输入,并在内部将glob字符串转换为正则表达式.例如:
"foo.? bar*"
Run Code Online (Sandbox Code Playgroud)
应转换为
"^.*foo\.\w\bar\w+.*"
Run Code Online (Sandbox Code Playgroud)
不知何故,我需要从字符串中转义所有有意义的字符,然后我需要替换glob*和?具有适当的正则表达式语法的字符.这样做最方便的方法是什么?
我想写容器类.此容器具有insert方法,该方法具有两个特征 - 首先使用复制构造函数将数据从一个容器复制到另一个容器元素.如果复制构造函数抛出异常我只是撤消对容器的所有更改,就像没有任何反应一样.
第二个专业化使用移动构造函数,这就是事情变得复杂的地方.当我将项目从一个容器移动到另一个容器元素时,移动构造函数可以抛出异常.如果发生这种情况 - 当一些元素被移动并且其他元素保留在原始位置时,我的状态非常混乱.如果我尝试移回元素 - 我可以得到另一个例外.
是否可以在异常安全方式或异常安全性中编写类似的内容,并且移动语义是互斥的?
我试图使用一个简单的for循环,一个std::accumulate
和一个manualy展开的for循环来对数组元素求和.正如我所料,手动展开的循环是最快的循环,但更有趣的是std :: accumulate比简单循环慢得多.这是我的代码,我使用带有-O3标志的gcc 4.7编译它.Visual Studio将需要不同的rdtsc函数实现.
#include <iostream>
#include <algorithm>
#include <numeric>
#include <stdint.h>
using namespace std;
__inline__ uint64_t rdtsc() {
uint64_t a, d;
__asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
return (d<<32) | a;
}
class mytimer
{
public:
mytimer() { _start_time = rdtsc(); }
void restart() { _start_time = rdtsc(); }
uint64_t elapsed() const
{ return rdtsc() - _start_time; }
private:
uint64_t _start_time;
}; // timer
int main()
{
const int num_samples = 1000;
float* samples …
Run Code Online (Sandbox Code Playgroud) 我有一个庞大的项目,大约有150,000个LOC的C++代码.建设时间约为15分钟.该项目由许多不同规模的子项目组成.
我为每个子项目构建了单独的预编译头,但是当我使用它们时,构建时间保持大致相同.似乎构建时间减少了5-10%,而不是更多.
绝对使用预编译的头文件,我使用-Winvalid-pch
选项,我尝试使用编译-H
器选项进行编译,我的预编译头文件在输出中出现'bang'符号,这意味着编译器能够使用预编译头文件.
我所有预编译的头文件都不是很大,每个文件大约有50Mb.我使用python脚本,在这里生成最常用的预编译头文件列表,所以我的预编译候选列表非常好.
是否有用于构建优化的免费/开源工具?标准make
实用程序似乎无法测量不同目标的构建时间.我无法找到获取不同目标统计数据的方法make
.我不是在谈论依赖性分析或者先进的东西.我只是想知道大部分时间浪费在哪些目标上.
此外,GCC似乎在处理预编译头文件方面效率很低.我无法让任何子项目构建速度明显更快,我得到的最大加速比例是20%,对于一个需要三分钟构建的项目.使用固态硬盘购买速度更快的机器似乎比使用GCC优化Linux上的构建时间更容易和更便宜.
我有一个非常简单的问题.我需要创建表示有序列表元素的模型.这个模型可以像这样实现:
class Item(models.Model):
data = models.TextField()
order = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
或者像这样:
class Item(models.Model):
data = models.TextField()
next = models.ForeignKey('self')
Run Code Online (Sandbox Code Playgroud)
什么方式首选?每个解决方案有哪些缺点?
我有一个很大的问题.我有一个公共库,在我的项目中使用.这个图书馆密集使用boost.spirit
和boost.fusion
.不幸的是,图书馆约.700Mb大小.使用了所有的重要boost.spirit
代码,它运行良好.可以采取哪些措施来减少其输出尺寸?是否有一个工具可以帮助确定哪些模板实例化浪费了大部分空间?
起初,我决定将所有精神感知代码移动到cpp文件.其次,我将尝试不同的编译器标志来优化大小.我不知道还能做什么.
更新(详细信息)
我正在使用GNU工具链.巨大的库实际上是一个静态库.使用这个700Mb库的可执行文件大小为200Mb.至少有一半的代码是*.h文件.一些boost.spirit
语法(非常模板重的东西)也位于*.h文件中.
干杯!