std::string
не существует во время компиляции. Если вы хотите иметь такое поведение, вы можете использовать строковые литералы с constexpr, как показано ниже:
constexpr const char* const var = "string";
Чтобы узнать больше об этом, смотрите код сборки, сгенерированный для этого:
#include <string>
int main()
{
constexpr const char* const str = "string";
const std::string test = "test";
}
С X86-64 Clang 6.0.0
компилятором и 0
оптимизацией
constexpr const char* const str = "string";
сгенерированный ниже код:
subq $80, %rsp
movq $.L.str, -8(%rbp)
leaq -48(%rbp), %rax
.L.str:
.asciz "string"
и для const std::string test = "test";
генерируется код ниже (просто фрагмент)
Поэтому он вызывает std::allocater
, который выделяет память в куче, а затем создает строковый объект.
movq %rax, %rdi
movq %rax, -72(%rbp) # 8-byte Spill
callq std::allocator<char>::allocator() [complete object constructor]
movl $.L.str.1, %ecx
movl %ecx, %esi
leaq -40(%rbp), %rdi
movq -72(%rbp), %rdx # 8-byte Reload
callq std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)
jmp .LBB0_1