Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何有效地混合常量和临时返回值? 我试图回到C++,但是在20年内有点改变了_C++ - Fatal编程技术网

如何有效地混合常量和临时返回值? 我试图回到C++,但是在20年内有点改变了

如何有效地混合常量和临时返回值? 我试图回到C++,但是在20年内有点改变了,c++,C++,我正在处理一个有一串字符串的网络流 我知道这些弦的绝大多数可能是什么,但不是全部 如果我知道所有的字符串可能是什么,我会将这些字符串映射到一个枚举,这样比较就很便宜,而且内存中不会有数百万个重复的字符串 因为我知道大多数字符串可能是什么,所以我想我应该创建一个包含大量const std::strings的文件,然后动态创建我不知道的字符串。然而,我似乎是在复制const std::string,而不是直接链接到它们 我写了一个愚蠢的程序来演示 我使用了下面的城市。我知道西雅图和塔科马,但不知道随

我正在处理一个有一串字符串的网络流

我知道这些弦的绝大多数可能是什么,但不是全部

如果我知道所有的字符串可能是什么,我会将这些字符串映射到一个枚举,这样比较就很便宜,而且内存中不会有数百万个重复的字符串

因为我知道大多数字符串可能是什么,所以我想我应该创建一个包含大量const std::strings的文件,然后动态创建我不知道的字符串。然而,我似乎是在复制const std::string,而不是直接链接到它们

我写了一个愚蠢的程序来演示

我使用了下面的城市。我知道西雅图和塔科马,但不知道随机城市

#include <algorithm>
#include <iostream>
#include <random>

const std::string SEATTLE("Seattle");

const std::string TACOMA("Tacoma");

std::random_device rd;

std::mt19937 gen(rd());

std::uniform_int_distribution<int> dist(0, 'Z' - 'A');

auto next = []() -> char {

    return static_cast<char>('A' + dist(gen));
};

const std::string factory(int in) {

    switch (in) {
        case 0: {
            return SEATTLE;
        }
        case 1: {
            return TACOMA;
        }
        default: {

            std::string retval(5, 0);

            std::generate_n(retval.begin(), 5, next);

            return retval;
        }
    }
}

int main(int argc, char **argv) {

    std::cout << "SEATTLE=" << &SEATTLE << std::endl;

    std::cout << "TACOMA=" << &TACOMA << std::endl;

    for (int i = 0; i < 4; ++i) {

        for (int j = 0; j < 4; ++j) {

            const std::string value = factory(i);

            std::cout << "i=" << i << " " << value << " " << &value << std::endl;
        }
    }
}
#包括
#包括
#包括
常数标准::字符串西雅图(“西雅图”);
常量std::字符串TACOMA(“TACOMA”);
std::随机_装置rd;
标准:mt19937 gen(rd());
标准:均匀分布区(0,'Z'-'A');
自动下一步=[]()->字符{
返回静态_cast('A'+距离(gen));
};
常量std::字符串工厂(int-in){
开关(输入){
案例0:{
返回西雅图;
}
案例1:{
返回塔科马;
}
默认值:{
std::string retval(5,0);
std::generate_n(retval.begin(),5,next);
返回返回;
}
}
}
int main(int argc,字符**argv){

std::cout您可以重用已知值,而无需复制,并通过稍微更改策略来使用为未知值构造的对象

std::function
传递到
factory
并从
factory
调用该函数

void factory(int in, std::function<void(std::string const&)> f) {

   switch (in) {
      case 0:
         // SEATTLE is passed by reference. No need for copy.
         f(SEATTLE);

      case 1:
         // TACOMA is passed by reference. No need for copy.
         f(TACOMA);

      default:
         // Construct a new object for unknown values. 
         std::string retval(5, 0);
         std::generate_n(retval.begin(), 5, next);
         f(retval);
   }
}

string就像一个整数。“我想要的是返回我的全局5和42,而不是一个副本”。这有道理吗?你原来的句子也是如此。“或者我应该不在乎吗?”我不会担心。你可能想得太快了。测试一下。首先,你可能想要避免的是复制字符串数据,即每个字符串所持有的字符集。但是这是相当有问题的。你需要考虑字符串数据的生存期和拥有性。全局常量显然没有所有者和他们的。生命周期是整个程序的生命周期。工厂制造的字符串是自动的。您不能将这两种类型混合在一起。全局字符串永远不会被销毁,本地字符串总是在块的末尾被销毁。因此,您必须制作全局字符串的本地副本,以便与其他本地字符串统一销毁。我认为这是正确的,或者至少是相同的很好。使用std::shared_ptr对于globals来说似乎很愚蠢,但是我很失望没有神奇的字符串缓存。谢谢
for (int i = 0; i < 4; ++i) {

   for (int j = 0; j < 4; ++j) {

      factory(i,
              [=](std::string const& value) { std::cout << "i=" << i << " " << value << " " << &value << std::endl;});
   }
}