Mana yang lebih baik untuk static const char* atau static const string untuk mendeklarasikan variabel statis

Saya sedang mengembangkan perpustakaan C++ lintas platform. Saya menginginkan cara yang lebih baik untuk mendefinisikan konstanta string yang akan digunakan di seluruh program. Mana yang lebih baik static const char * atau static const std::string? Apakah constexpr membuat mereka lebih baik dari deklarasi lama?

static const char *str = "hello world";

vs

static const string str = "hello world";

Mengapa saya memerlukan ini: Program saya mungkin harus menginisialisasi banyak variabel statis bertipe string literal sebelum memulai aplikasi. Dan saya tidak bisa mengabaikan variabel statis karena variabel tersebut digunakan di seluruh file. Jika saya harus meningkatkan kinerja, tetapi mengurangi waktu inisialisasi variabel statis. Idealnya saya ingin sebagian besar hal terjadi pada waktu kompilasi daripada waktu proses. pilihan mana yang lebih baik?


person venkat satish Katta    schedule 09.04.2019    source sumber
comment
Apa gunanya statis di sini?   -  person Michael Chourdakis    schedule 09.04.2019
comment
lebih baik sehubungan dengan apa? interoperabilitas dengan c atau dalam hal menghindari akses di luar batas? ;)   -  person 463035818_is_not_a_number    schedule 09.04.2019
comment
Itu tergantung pada apa yang Anda lakukan untuk mengatasinya.   -  person François Andrieux    schedule 09.04.2019
comment
Kuncinya adalah apa yang perlu dilakukan string tersebut? Apakah Anda perlu mendapatkan panjangnya? Apakah Anda menginginkan kenyamanan string.length() atau Anda ingin menggunakan strlen(). Untuk itu Anda bisa #define STRCONST1 "My String Const" dan seterusnya. Itu tergantung pada bagaimana Anda ingin menggunakannya di seluruh kode Anda. Tentu saja, char * akan lebih sedikit kompiler dan sumber daya yang intensif, #define bahkan lebih sedikit lagi, tetapi std::string menawarkan banyak hal, keduanya tidak memberikan sedikit biaya tambahan.   -  person David C. Rankin    schedule 09.04.2019
comment
Anda lupa string_view yang menggantikan const char* di C++ modern (dan yang berfungsi dengan constexpr yang harus Anda gunakan dalam kasus tersebut).   -  person Matthieu Brucher    schedule 09.04.2019
comment
@DavidC.Rankin saya tidak memerlukan strlen(). Seringkali ini digunakan untuk membandingkan dengan string lain atau objek string baru dibuat dengan variabel ini.   -  person venkat satish Katta    schedule 09.04.2019
comment
@MatthieuBrucher, string_view adalah c++17, kami menggunakan c++14   -  person venkat satish Katta    schedule 09.04.2019
comment
@ user463035818, menghindari penundaan waktu startup aplikasi, karena variabel statis diinisialisasi sebelum aplikasi dimulai.   -  person venkat satish Katta    schedule 09.04.2019
comment
Yang kedua Anda menetapkan char const* ke std::string. Mengapa tidak menggunakan sintaks baru yang memungkinkan Anda menentukan std::string literal. static const string str = "hello world"s; (perhatikan huruf terakhir) en.cppreference.com/w /cpp/string/basic_string/operator%22%22s   -  person Martin York    schedule 09.04.2019


Jawaban (5)


Biasanya, std::string bagus tetapi bagaimanapun juga itu tergantung pada apa yang ingin Anda lakukan. Tidak ada obat mujarab yang mutlak di sini. std::string memiliki konstruktor dan akan memanggil new/malloc misalnya (ketika pengoptimalan string kecil SSO tidak dapat diterapkan). Jika ini tidak diinginkan karena alasan apa pun, gunakan const char*.

Tergantung juga dimana akan digunakan. Jika ini adalah judul jendela HWND misalnya dan penggunaan utamanya adalah dengan fungsi Windows API, tidak akan berbeda jika Anda menggunakan metode c_str() std::string sepanjang waktu.

Semua ini untuk menunjukkan bahwa tidak ada preferensi 100% untuk satu atau yang lain.

Penggunaan static atau tidaknya adalah pembahasan lain.

person Michael Chourdakis    schedule 09.04.2019
comment
Program saya mungkin harus menginisialisasi banyak variabel statis bertipe string literal sebelum memulai main. Dan saya tidak bisa mengabaikan variabel statis karena variabel tersebut digunakan di seluruh file. - person venkat satish Katta; 09.04.2019
comment
std::string has a constructor and will call new/malloc for example pernyataan itu salah. Setiap implementasi modern mengimplementasikan SSO (small string optimasi) yang disimpan di stack - person KostasRim; 10.04.2019

Itu akan tergantung pada apa yang Anda lakukan dengan variabel-variabel ini. Misalnya, lihat ini:

void do_stuff(std::string const&);

void stuff() {
    while(/* some condition */) {
        do_stuff(constant); // very hot loop
    }
}

Mari kita ambil dua cara untuk mendefinisikan variabel constant:

constexpr auto constant = "value";          // (1)
auto const constant = std::string{"value"}; // (2)

Dalam kasus hot loop, jika Anda mengambil (1), string akan dibuat setiap saat. Jika nilai stringnya cukup panjang, dapat menyebabkan alokasi. Maka (2) lebih baik untuk kasus itu.

Di sisi lain, jika Anda memfaktorkan ulang kode Anda menjadi seperti ini:

void do_stuff(std::string_view);

void stuff() {
    while(/* some condition */) {
        do_stuff(constant); // very hot loop
    }
}

Maka program Anda akan lebih cepat dengan (1), karena tidak ada alokasi dinamis yang akan terjadi. Program Anda akan mengacu pada data asli hanya baca dari program Anda.

person Guillaume Racicot    schedule 09.04.2019

Dengan C++ modern saya akan menggunakan std::string_view.

Jika Anda memerlukannya menjadi std::string maka opsi terbaik adalah mendefinisikannya sebagai variabel lokal statis dalam suatu fungsi, sehingga dengan malas diinisialisasi pada permintaan pertama.

/* inline or not */
std::string const& get_that_string() {
    static std::string const str { "value" };
    return value;
}
person bobah    schedule 09.04.2019
comment
Pendekatan ini mungkin tidak dapat diperluas, jika memiliki jumlah variabel statis yang banyak. fungsi menulis untuk semuanya mungkin berlebihan - person venkat satish Katta; 09.04.2019
comment
gunakan string_view lalu - person bobah; 09.04.2019

Kecuali jika ada masalah yang diketahui dalam basis kode spesifik Anda dengan penggunaan std::string, saya sangat menyarankan menggunakan std::string.

static std::string const str = "hello world";
person R Sahu    schedule 09.04.2019

Secara umum Anda sebaiknya memilih std::string daripada char*. static tidak ada hubungannya dengan itu.

person Code-Apprentice    schedule 09.04.2019
comment
pertanyaannya adalah tentang mendeklarasikan variabel statis...jadi static memang ada hubungannya dengan itu;) - person 463035818_is_not_a_number; 09.04.2019