【问题标题】:force allocate char[] (string) in the stack instead of global强制在堆栈中分配 char[] (string) 而不是全局
【发布时间】:2015-04-15 06:04:27
【问题描述】:

我试图强制编译器在堆栈中分配内联字符串: 此代码分配 .rdata 部分中的字符串:

foo("test");

这段代码在堆栈中分配字符串:

char szt1[] = "test1";
foo(szt1);

这正是我想要强制的。

如何强制编译总是在堆栈中分配数组? 我正在使用 gcc。

谢谢

【问题讨论】:

  • 看来您已经有了答案?只需使用您的第二个 sn-p...
  • 严肃的问题:为什么你想这样做?我真的很好奇你为什么真的想要这个。如果你有充分的理由,也许你会教我一些新东西。
  • 如果你使用 '-fwritable-strings' gcc 选项会发生什么?我从来没有用过,只是觉得它可能会有所帮助。它应该禁用字符串池。
  • 第二个代码sn-p在栈上分配了一个char指针,指向静态数据“test1”。堆栈不能在编译时分配静态。编译时栈的地址是未知的。
  • -fno-const-strings & -fwritable-strings 在 g++ 4.9.2 上不受支持

标签: c++ string gcc stack


【解决方案1】:

没有什么好的方法可以做到这一点,而且可能没有太多好的理由希望这种行为。

如果您不希望字符串存​​在于数据段中,最接近的方法是分配char 的自动数组并为其分配字符,一次一个。

char hello[6] = {};
hello[0] = 'h'; hello[1] = 'e'; hello[2] = 'l'; hello[3] = 'l'; hello[4] = 'o';

【讨论】:

  • 您不需要strcpy()char hello[] = "hello" 将字符串文字字符存储在数据段中(与您的示例相同),然后在运行时在堆栈上分配数组并将字符复制到数组中。使用strcpy() 只是一种显式方式,与编译器隐式执行相同的操作。
  • char hello[6] = {'h','e','l','l','o',0}; 是一样的,但要短得多。
【解决方案2】:

oneliner 是foo(std::string("test").c_str());

好吧,从技术上讲,您不知道小字符串优化会起作用,但是您甚至不知道是否存在常规堆栈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2021-05-20
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多