小编Pra*_*tic的帖子

为什么Git使用加密哈希函数?

为什么Git使用加密哈希函数SHA-1而不是更快的非加密哈希函数?

相关问题:

Stack Overflow问题为什么Git使用SHA-1作为版本号?问为什么Git使用SHA-1而不是序列号进行提交.

git hash-function

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

通过const值返回的目的?

const的目的是什么?

const Object myFunc(){
    return myObject;
}
Run Code Online (Sandbox Code Playgroud)

我刚刚开始阅读Effective C++,而第3项提倡这一点,Google搜索也提出了类似的建议,但也有反作用.我看不出在这里使用const会更好.假设需要按值返回,我认为没有任何理由保护返回的值.给出为什么这可能有用的示例是防止返回值的意外bool强制转换.实际问题是应该使用explicit关键字来防止隐式bool强制转换.

在这里使用const可以防止在没有赋值的情 所以我无法用这些对象执行算术表达式.似乎没有一个未命名的const有用的情况.

在这里使用const获得了什么,何时更可取?

编辑:将算术示例更改为修改在分配之前可能要执行的对象的任何函数.

c++ const

119
推荐指数
3
解决办法
10万
查看次数

输入*args和**kwargs的注释

我正在尝试使用抽象基类的Python类型注释来编写一些接口.有没有办法注释可能的类型*args**kwargs

例如,如何表达函数的合理参数是一个int还是两个inttype(args)给人Tuple所以我的猜测是,注释类型Union[Tuple[int, int], Tuple[int]],但是这是行不通的.

from typing import Union, Tuple

def foo(*args: Union[Tuple[int, int], Tuple[int]]):
    try:
        i, j = args
        return i + j
    except ValueError:
        assert len(args) == 1
        i = args[0]
        return i

# ok
print(foo((1,)))
print(foo((1, 2)))
# mypy does not like this
print(foo(1))
print(foo(1, 2))
Run Code Online (Sandbox Code Playgroud)

来自mypy的错误消息:

t.py: note: In function "foo":
t.py:6: error: Unsupported operand types for + ("tuple" and "Union[Tuple[int, int], Tuple[int]]") …
Run Code Online (Sandbox Code Playgroud)

python typing typechecking type-hinting

99
推荐指数
7
解决办法
3万
查看次数

为什么要使用_mm_malloc?(与_aligned_malloc,alligned_alloc或posix_memalign相对)

获取一个对齐的内存块有几个选项,但它们非常相似,问题主要归结为您所针对的语言标准和平台.

C11

void * aligned_alloc (size_t alignment, size_t size)
Run Code Online (Sandbox Code Playgroud)

POSIX

int posix_memalign (void **memptr, size_t alignment, size_t size)
Run Code Online (Sandbox Code Playgroud)

视窗

void * _aligned_malloc(size_t size, size_t alignment);
Run Code Online (Sandbox Code Playgroud)

当然,手动对齐也是一种选择.

英特尔提供另一种选择

英特尔

void* _mm_malloc (int size, int align)
void _mm_free (void *p)
Run Code Online (Sandbox Code Playgroud)

基于英特尔发布的源代码,这似乎是分配工程师喜欢的对齐内存的方法,但我找不到任何将其与其他方法进行比较的文档.我发现的最接近的只是承认存在其他对齐的内存分配例程.

https://software.intel.com/en-us/articles/memory-management-for-optimal-performance-on-intel-xeon-phi-coprocessor-alignment-and

要动态分配一段对齐的内存,请使用posix_memalign,它由GCC和Intel Compiler支持.使用它的好处是您不必更改内存处理API.您可以像往常一样使用free().但要注意参数配置文件:

  int posix_memalign(void**memptr,size_t align,size_t size);

英特尔编译器还提供另一组内存分配API.C/C++程序员可以使用_mm_malloc和_mm_free来分配和释放对齐的内存块.例如,以下语句为8个浮点元素请求64字节对齐的内存块.

  farray =(float*)__ mm_malloc(8*sizeof(float),64);

必须使用_mm_free释放使用_mm_malloc分配的内存.在使用_mm_malloc分配的内存上调用free或在使用malloc分配的内存上调用_mm_free将导致不可预测的行为.

从用户的角度来看,明显的区别是_mm_malloc需要直接的CPU和编译器支持以及分配的内存_mm_malloc必须被释放_mm_free.鉴于这些缺点,使用_mm_malloc?它的原因是什么?它有轻微的性能优势吗?历史事故?

c memory-management intel dynamic-memory-allocation

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

为什么malloc比英特尔的icc新7倍?

我对malloc与new进行了基准测试,以分配浮点数组.我的理解是malloc执行的操作是new执行的操作的一个子集 - malloc只分配但是新的分配和构造,尽管我不确定这对于原语是否有意义.

使用gcc对结果进行基准测试可以得出预期的行为.malloc()更快.甚至有些问题与此问题相反.

使用icc malloc可以比新的慢7倍.怎么可能?!

接下来的一切只是基准程序的细节.

对于基准测试,我使用了英特尔最近描述的协议.这是我的结果.

使用GNU的gcc分配4000个浮点数时,时钟周期已经过去了:

new memory allocation, cycles            12168
malloc allocation, cycles                 5144
Run Code Online (Sandbox Code Playgroud)

借助英特尔的icc:

new    memory allocation clock cycles     7251
malloc memory allocation clock cycles    52372
Run Code Online (Sandbox Code Playgroud)

我是如何使用malloc的:

volatile float* numbers = (float*)malloc(sizeof(float)*size);
Run Code Online (Sandbox Code Playgroud)

我是如何使用新的:

volatile float* numbers = new float[size];
Run Code Online (Sandbox Code Playgroud)

volatile是存在的,因为在之前的基准测试尝试中,我遇到了一些问题,这些编译器优化了整个函数调用并生成只存储常量的程序.(编译器选择以这种方式优化的函数实现确实比它没有的更快!)我尝试使用volatile去除只是为了确定并且结果是相同的.

我将要在两个宏之间进行基准测试的代码部分夹在中间.

功能前的宏:

#define CYCLE_COUNT_START \
asm volatile ("CPUID\n\t" \
"RDTSC\n\t" \
"mov %%edx, %0\n\t" \
"mov %%eax, %1\n\t": "=r" (cycles_high), "=r" (cycles_low):: \
"%rax", "%rbx", "%rcx", "%rdx");
Run Code Online (Sandbox Code Playgroud)

函数后面的宏:

#define CYCLE_COUNT_END \
asm volatile("RDTSCP\n\t" …
Run Code Online (Sandbox Code Playgroud)

c++ performance memory-management icc

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

Python中笛卡尔坐标中四点的二面角/扭转角

人们对在Python中快速计算二面角有什么建议?

在图中,phi是二面角:

二面角1

二面角2

在0到pi范围内计算角度的最佳方法是什么?0到2pi怎么样?

这里的"最佳"意味着快速和数字稳定的混合.在0到2pi的整个范围内返回值的方法是首选,但如果您有一种非常快速的方法来计算0到pi的二面角,那么也是如此.

这是我最好的3个努力.只有第二个返回0到2pi之间的角度.它也是最慢的.

关于我的方法的一般评论:

Numpy的arccos()似乎很稳定但是由于人们提出这个问题,我可能还没有完全理解它.

使用einsum来自这里.为什么numpy的einsum比numpy的内置函数更快?

图表和一些灵感来自这里.如何在给定笛卡尔坐标的情况下计算二面角?

3条评论方法:

import numpy as np
from time import time

# This approach tries to minimize magnitude and sqrt calculations
def dihedral1(p):
    # Calculate vectors between points, b1, b2, and b3 in the diagram
    b = p[:-1] - p[1:]
    # "Flip" the first vector so that eclipsing vectors have dihedral=0
    b[0] *= -1
    # Use dot product to find the components of b1 and b3 that are not
    # perpendicular …
Run Code Online (Sandbox Code Playgroud)

python math numpy

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

什么时候应该重新运行cmake?

在运行cmake命令一次以生成构建系统之后,是否应该重新运行cmake命令?

生成的构建系统可以检测相关CMakeLists.txt文件中的更改并相应地执行操作.您可以在生成的Makefile中看到这样做的逻辑.成功何时成功的确切规则对我来说是神秘的.

我应该什么时候重新开始cmake?答案取决于使用的发电机吗?

这篇博客文章(在标题下:"多次调用CMake")指出了对这个问题的困惑,并指出答案实际上是"从不",无论发生器如何,但我发现这令人惊讶.这是真的吗?

cmake

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

C++库应该如何允许自定义分配器?

在C中,对于库来说,允许用户通过使用函数的全局函数指针来自定义内存分配是很简单的,该函数应该malloc()与应该表现类似的函数类似free().例如,SQLite使用这种方法.

C++使事情变得复杂,因为分配和初始化通常是融合的.从本质上讲,我们希望获得被覆盖的行为,operator new并且operator delete只有一个库,但实际上没有办法实现(我相当肯定,但不是100%).

如何在C++中完成?

是对new使用函数复制表达式的某些语义的东西的第一次尝试Lib::make<T>.

我不知道这是否有用,但只是为了好玩,是一个更复杂的版本,也试图复制new[]表达式的语义.

这是一个面向目标的问题,所以我不一定要寻找代码审查.如果有更好的方法,只需这样说并忽略链接.

(通过"allocator"我只是指分配内存的东西.我不是指STL分配器概念,甚至不是为容器分配内存.)


为什么这可能是可取的:

是一篇来自Mozilla dev的博客文章,他们认为图书馆应该这样做.他给出了几个允许库用户自定义库分配的C库示例.我查看了其中一个示例SQLite的源代码,并看到此功能也在内部用于通过故障注入进行测试.我不是在编写任何需要像SQLite一样防弹的东西,但它似乎仍然是一个明智的想法.如果不出意外,它允许客户端代码弄清楚"哪个库正在占用我的记忆以及何时?".

c++ memory-management allocation c++14

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

为什么const引用会延长rvalues的生命周期?

为什么C++委员会决定const引用应该延长temporaries的生命周期?

这个事实已经在网上广泛讨论过,包括stackoverflow.解释这种情况的最终资源可能就是GoTW:

GotW#88:"最重要的const"的候选人

这种语言功能的基本原理是什么?它知道了吗?

(另一种选择是临时的寿命不会被任何参考文献扩展.)


我自己的宠物理论的基本原理是这种行为允许对象隐藏实现细节.使用此规则,成员函数可以在不对客户端代码进行任何更改的情况下,在返回值或const引用与已内部存在的值之间切换.例如,矩阵类可能能够返回行向量和列向量.为了最小化副本,可以返回一个或另一个作为参考,具体取决于实现(行主要与列主要).无论通过引用返回哪一个都必须通过复制并返回该值来返回(如果返回的向量是连续的).库编写者可能希望在未来改变实现(行主要与列专业),并防止客户端编写强烈依赖于实现是行主要还是列主要的代码.通过要求客户端接受返回值为const ref,矩阵类可以返回const引用或值,而无需对客户端代码进行任何更改.无论如何,如果原始的理由是已知的,我想知道它.

c++ standards

17
推荐指数
2
解决办法
2851
查看次数

为什么std :: uncaught_exception会改为std :: uncaught_exceptions?

我刚注意到了

http://en.cppreference.com/w/cpp/error/uncaught_exception

C++ 17将替换std::uncaught_exception(),返回a bool,with std::uncaught_exceptions(),返回一个int.

描述这个的标准的补充在这里:

http://isocpp.org/files/papers/n4259.pdf

它没有提供理由,但确实如此

[注意:当uncaught_exceptions()> 0时,抛出异常会导致调用std :: terminate()(15.5.1). - 结束说明]

这是奇怪的模糊.

这种变化的原因是什么?在C++ 17或标准的某些未来版本中,是否可以有多个活动异常?

c++ exception c++17

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