小编use*_*918的帖子

C++:获取范围内整数的最快方法

我需要生成大约N = 1亿个密钥的哈希密钥.从我的研究看来,murmur3(MurmurHash3_x86_32,见murmur3 hash)将是最快的散列函数,具有最佳延迟和足够小的碰撞率.我面临的问题是该函数返回键为 void *.更具体地说,模板是:

void MurmurHash3_x86_32 (const void *key, int len, uint32_t seed, void *out);

由于我的哈希表大小将小于它可以生成的最大哈希,我需要将它放入表范围[0,N-1].最简单的解决方案似乎是使用%运算符.但由于众所周知这是一个缓慢的操作员,我想知道是否有更快的方法来解决问题.

我发现一个有趣的建议是否有替代在C/C++中使用%(模数)?在StackOverflow本身.它暗示了"两个人的力量,以下作品(假设两个补语表示)":

return i & (n-1);

我的问题是,在较新的CPU上,它有时(或者大部分时间都是这样?),由于多路缓存线,性能会在大约2 ^ n,IIRC附近降低.(此链接提供有关插入大内存的说明,第3.5部分:Google sparsehash!).

目前,murmur3的优势似乎因硬件相关问题和%运营商的低效率而无效.由于性能是一个约束,我要求低延迟和更快的解决方案,即使它不是MurmurHash3_x86_32.

c c++ hash modulo low-latency

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

C++ 11 lambda表达式末尾的括号

我对C++ 11 lambdas遇到的一些例子感到困惑.例如:

#include <iostream>
#include <string>

using namespace std;

int main()
{ 
        cout << []()->string{return "Hello World 1!";}() << endl;

        []{cout << "Hello World 2!" << endl;}();

        string result = [](const string& str)->string {return "Hello World " + str;}("2!");
        cout << "Result: " << result << endl;

        result = [](const string& str){return "Hello World " + str;}("3!");
        cout << "Result: " << result << endl;

        string s;
        [&s](){s = "Hello World 4!";};   // does not work
        cout << s …
Run Code Online (Sandbox Code Playgroud)

c++ lambda parentheses c++11

5
推荐指数
2
解决办法
1302
查看次数

关于memmove的实现

我正在研究wikibooks.org上的公共域实现.它实现了memmove(),如下明确声明它"不完全可移植"!我想知道为什么:

  1. 括号放在代码的第一行,和
  2. 代码不是完全可移植的.

代码如下:

void *(memmove)(void *s1, const void *s2, size_t n)
{
   char *p1 = s1;
   const char *p2 = s2;

   if (p2 < p1 && p1 < p2 + n) {
       /* do a descending copy */
       p2 += n;
       p1 += n;
       while (n-- != 0)
           *--p1 = *--p2;
   } else
       while (n-- != 0)
           *p1++ = *p2++;

   return s1;
}
Run Code Online (Sandbox Code Playgroud)

c portability memmove

5
推荐指数
2
解决办法
359
查看次数

Scala:逐行读取巨大的压缩文本文件而不加载到内存中

我有一个大小为 100-200 GB 的文本文件。所以我希望以压缩格式存储(例如zip)。但是,由于其大小,我需要一次处理一行。虽然使用 一次一行读取文本文件很简单io.Source.fromFile(fileName).getLines,但这仅适用于解压缩的文件。

有没有一些有效的方法可以在scala中逐行读取压缩文件?我找不到任何示例,但我看到的更接近的实现是here,但它将文件加载到内存中。与通常给出的使用 zip 存档的示例不同,我只需要处理一个压缩的文本文件。如果有任何指示或线索,我将不胜感激。

compression io scala

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

C中静态函数声明的区别

C中的以下声明有什么区别?

static int foo(){}
int static foo(){}

据我所知,第一种格式在教科书中使用和订阅,而第二种格式似乎也可以使用.声明是否相同?

c static function

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

C中的运算符优先级

可能重复:
为什么"++ x || ++ y && ++ z"首先计算"++ x"?但是,运算符"&&"高于"||"

以下程序似乎没有按预期工作.'&&'具有比'||'更高的优先级,因此实际输出令人困惑.有谁能解释o/p吗?

#include <stdio.h>

int main(int argc, char *argv[])
{
    int x;
    int y;
    int z;

    x = y = z = 1;

    x++ || ++y && z++;

    printf("%d %d %d\n", x, y, z);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

实际输出为:2 1 1

TIA.

c operator-precedence operator-keyword

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

地址长度的字符串文字

我看到在使用GCC的Linux系统上,字符串文字的地址似乎比其他变量小得多.例如,以下代码生成下面显示的o/p.

#include <stdio.h>

int main()
{
    char *str1 = "Mesg 1";
    char *str2 = "Mesg 2";
    char str3[] = "Mesg 3";
    char str4[] = "Mesg 4";

    printf("str1 = %p\n", (void *) str1);
    printf("str2 = %p\n", (void *) str2);
    printf("&str3 = %p\n", (void *) str3);
    printf("&str4 = %p\n", (void *) str4);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

str1 = 0x400668
str2 = 0x40066f
&str3 = 0x7fffcc990b10
&str4 = 0x7fffcc990b00
Run Code Online (Sandbox Code Playgroud)

这种用法是否有一个独立的地址空间?

c memory gcc const string-literals

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

C99:"int const*ptr"是什么意思?

我正在查看C99规范(N1256.pdf),其中说(第11506页):

const int *ptr_to_constant;
int *const constant_ptr;
Run Code Online (Sandbox Code Playgroud)

"ptr_to_constant指向的任何对象的内容不应该通过该指针修改,但是ptr_to_constant本身可以更改为指向另一个对象.同样,constant_ptr指向的int的内容可能会被修改,但是constant_ptr本身应该总是指向同一地点." (6.7.5.1指针声明符)

从我之前读到的内容来看,以下两个陈述产生了相同的行为.

int *const constant_ptr; /* This form is mentioned in the standard */
int const *constant_ptr; /* This form is NOT mentioned in the standard */
Run Code Online (Sandbox Code Playgroud)

我想知道第二种形式是正确的还是只是一种延伸.

在此先感谢,-S

c pointers constants c99

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

为什么Perl中的$ a的严格编译指示失败?

以下代码具有异常行为,我发现它很奇怪.它只是一个以其他方式工作的程序的一部分.

 #!/usr/bin/perl -w

    use strict;

    $a = 0;
    $abc = 0;                                                                                       

 exit 0;
Run Code Online (Sandbox Code Playgroud)

由于use strict语句Perl坚持我将第二个声明修改为:

my $abc = 0;

但它没有这样做$a!我在多个Linux发行版和Perl版本上试过这个.请问有人解释原因吗?

perl pragma

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

C格式说明符与数据类型不匹配

我想知道,根据C规范,如果给定的数据类型与预期的格式说明符不匹配,C中的预期行为是什么.例如:

    printf("%lu\n", 2);
Run Code Online (Sandbox Code Playgroud)

c format specifications

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

C++:C字符串到std:string

我正在尝试使用函数将C字符串转换为std :: string.该功能在64位上正常工作gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9).但是当我编译它-O2-O3优化它时,会出现段错误.它适用于-O1.有人可以建议修复或解决这个问题吗?功能如下:

void make_name(unsigned const &i, string &h_file)
{
        char h_str[10];
        sprintf(h_str, "tmp/%09d.hb", i);
        h_file = string(h_str);
}
Run Code Online (Sandbox Code Playgroud)

c++ string type-conversion

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