gpt4 book ai didi

c++ - 在执行时加载常量,一次还是两次?

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:13 24 4
gpt4 key购买 nike

我对加载 C++ 生成的可执行文件有点困惑。我将一个巨大的常量字符串表放入目标可执行文件中。数据应嵌入可执行文件(无外部文件)。

struct DataRecord
{
unsigned char n1;
unsigned char n2;
std::string text;
};

static const DataRecord data[] = {
{1, 2, "Hello"},
{1, 3, "Hi"},
{1, 4, "Bye"}
.
.
VERY LONG LIST
.
.
};

编译生成代码后运行,会出现两种情况:

  1. OS 加载巨大的可执行文件(需要时间),然后,运行程序,之后,程序就有了数组 data 可以使用了。

  2. OS 加载巨大的可执行文件(需要时间),然后,运行程序,之后,程序必须创建表并加载字符串文字并构造那些 std::string 对象(需要时间)。

很明显第二个比第一个慢。

  • 如何知道哪一个会发生?
  • 拥有大量嵌入式数据的最佳方法是什么(权衡:速度和空间)?
  • 使用工具 objcopy 有用吗(我没有任何使用经验)?

我使用的是 gcc 4.7+,目标操作系统是 Windows/Linux/Android(NDK)

最佳答案

在这种情况下,必须调用构造函数。您示例中字符串的构造函数不能“在编译时完成”。 [编辑:由于 std::string 必须调用 operator new() 来分配内存(或以其他方式分配内存,尽管有时这可能是避免短字符串,不太可能充分推导出此决定以使编译器可以“就地”构建正确的数据结构——结束编辑]

在这种特殊情况下,您可以通过使用 const char * 而不是 std::string 来避免构造,但假设字符串不会被修改,这当然可能是一个延伸[并且如果您需要所有字符串在使用之前都是 std::string ,并且您使用大表中的所有字符串,那么几乎没有,如果有的话,受益]。

顺便说一下,(在大多数操作系统中)该程序不会加载代码“一口气加载所有代码,需要很长时间”。相反,它加载“入口点”(在一个 4KB 的 block 中,这是包含入口点的 4KB 对齐的代码块)。其他一切都是“按需加载”的——也就是说,它是在需要的时候加载的。

关于c++ - 在执行时加载常量,一次还是两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16573435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com