我想强制字符串在运行时通过汇编指令动态分配到局部变量 没有 字符串占用数据部分的内存(例如读取)只有数据部分)。
以下似乎完美无缺:
char foo[] = "bar";
汇编代码变为:
movl $7496034, 40(%esp)
因此,foo
在运行时通过"bar"
指令初始化为movl
。
如何强制它在所有字符串操作中发生?
例如,如果我将字符串文字传递给函数:
testfunc("bar");
在这种情况下,字符串"bar"
将在一个部分中分配。
答案 0 :(得分:5)
您展示的技术仅适用于您的特殊情况。通常,编译器可以自由地将字符串的内容放入节中。例如,通过这个小调整:
char foo[] = "bar\0";
该字符串现在将显示在只读数据部分中。
知道该技术不能保证始终有效,您可以使用宏来自动化该技术,这样您就可以将字符串传递给函数,而无需使用指向只读部分的指针。
#define string_invoke(Func, Str) \
[]() -> decltype(Func(NULL)) { \
char foo[] = Str; \
return Func(foo); \
}()
答案 1 :(得分:3)
你想要用四个字符初始化一个四字符的字符串(“bar”加上空终止符。)编译器识别出一个很棒的微优化机会,并将一个四字节整数保存到字符串中具有与“bar”相同的位模式。在64位计算机上,编译器也可能将此技术用于8个字符的字符串。精彩!但是,不要指望这种优化适用于使用C字符串的任何地方。
例如,当函数将C字符串作为参数时,它期望指向数组的指针,而不是整数。
将代码强制转换为强制特定的编译器优化是编写不可维护的脆弱代码的好方法。您最好使用有效的算法编写清晰的代码,并享受编译器可以应用的任何优秀的优化。