小编Evg*_*zin的帖子

为什么IEEE754标准中的除零导致无限值?

我只是好奇,为什么在IEEE-754任何非零浮点数除以零时会产生无穷大的值?从数学角度来看,这是无稽之谈.所以我认为这个操作的正确结果是NaN.

如果x是实数,则当x = 0时,不定义函数f(x)= 1/x.例如,如果IEEE-754生成NaN值,则不为任何负数定义函数sqrt,并为sqrt(-1.0f)定义函数sqrt .但1.0f/0是Inf.

但由于某些原因,事实并非如此IEEE-754.必须有一个原因,可能是一些优化或兼容性原因.

那有什么意义呢?

language-agnostic floating-point ieee-754

41
推荐指数
3
解决办法
7771
查看次数

向量,结构和std :: find

再次我与矢量.我希望我不会太讨厌.我有这样的结构:

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元素进行迭代,我不知道该怎么做.非常感谢帮助.谢谢 !

c++ vector find data-structures

30
推荐指数
4
解决办法
5万
查看次数

CMake和编译器警告

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)

gcc cmake

22
推荐指数
1
解决办法
4万
查看次数

如何在使用cmake构建项目后运行ctest

我希望每次成功构建项目时都会启动测试.如果某些测试被破坏,我希望我的构建也被打破.默认情况下,我需要通过运行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在构建目标后运行.

cmake ctest

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

从glob表达式创建正则表达式

我编写用正则表达式解析文本的程序.应从用户处获得正则表达式.我希望使用glob语法进行用户输入,并在内部将glob字符串转换为正则表达式.例如:

"foo.? bar*" 
Run Code Online (Sandbox Code Playgroud)

应转换为

"^.*foo\.\w\bar\w+.*"
Run Code Online (Sandbox Code Playgroud)

不知何故,我需要从字符串中转义所有有意义的字符,然后我需要替换glob*和?具有适当的正则表达式语法的字符.这样做最方便的方法是什么?

regex search glob

20
推荐指数
2
解决办法
2万
查看次数

异常安全代码和移动语义

我想写容器类.此容器具有insert方法,该方法具有两个特征 - 首先使用复制构造函数将数据从一个容器复制到另一个容器元素.如果复制构造函数抛出异常我只是撤消对容器的所有更改,就像没有任何反应一样.

第二个专业化使用移动构造函数,这就是事情变得复杂的地方.当我将项目从一个容器移动到另一个容器元素时,移动构造函数可以抛出异常.如果发生这种情况 - 当一些元素被移动并且其他元素保留在原始位置时,我的状态非常混乱.如果我尝试移回元素 - 我可以得到另一个例外.

是否可以在异常安全方式或异常安全性中编写类似的内容,并且移动语义是互斥的?

c++ c++11

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

为什么std :: accumulate这么慢?

我试图使用一个简单的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)

c++ optimization performance

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

GCC构建时间不会从预编译头中获益

我有一个庞大的项目,大约有150,000个LOC的C++代码.建设时间约为15分钟.该项目由许多不同规模的子项目组成.

我为每个子项目构建了单独的预编译头,但是当我使用它们时,构建时间保持大致相同.似乎构建时间减少了5-10%,而不是更多.

绝对使用预编译的头文件,我使用-Winvalid-pch选项,我尝试使用编译-H器选项进行编译,我的预编译头文件在输出中出现'bang'符号,​​这意味着编译器能够使用预编译头文件.

我所有预编译的头文件都不是很大,每个文件大约有50Mb.我使用python脚本,在这里生成最常用的预编译头文件列表,所以我的预编译候选列表非常好.

是否有用于构建优化的免费/开源工具?标准make实用程序似乎无法测量不同目标的构建时间.我无法找到获取不同目标统计数据的方法make.我不是在谈论依赖性分析或者先进的东西.我只是想知道大部分时间浪费在哪些目标上.

此外,GCC似乎在处理预编译头文件方面效率很低.我无法让任何子项目构建速度明显更快,我得到的最大加速比例是20%,对于一个需要三分钟构建的项目.使用固态硬盘购买速度更快的机器似乎比使用GCC优化Linux上的构建时间更容易和更便宜.

c++ gcc build-process gnu-make precompiled-headers

15
推荐指数
2
解决办法
2927
查看次数

django中的有序列表

我有一个非常简单的问题.我需要创建表示有序列表元素的模型.这个模型可以像这样实现:

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)

什么方式首选?每个解决方案有哪些缺点?

python django django-models

13
推荐指数
2
解决办法
4274
查看次数

如何减少模板繁重的C++代码的输出大小?

我有一个很大的问题.我有一个公共库,在我的项目中使用.这个图书馆密集使用boost.spiritboost.fusion.不幸的是,图书馆约.700Mb大小.使用了所有的重要boost.spirit代码,它运行良好.可以采取哪些措施来减少其输出尺寸?是否有一个工具可以帮助确定哪些模板实例化浪费了大部分空间?

起初,我决定将所有精神感知代码移动到cpp文件.其次,我将尝试不同的编译器标志来优化大小.我不知道还能做什么.

更新(详细信息)

我正在使用GNU工具链.巨大的库实际上是一个静态库.使用这个700Mb库的可执行文件大小为200Mb.至少有一半的代码是*.h文件.一些boost.spirit语法(非常模板重的东西)也位于*.h文件中.

干杯!

c++ templates boost-spirit

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