สิ่งไหนดีกว่าสำหรับ static const char* หรือ static const string สำหรับการประกาศตัวแปรคงที่

ฉันกำลังพัฒนาไลบรารี C++ ข้ามแพลตฟอร์ม ฉันต้องการวิธีที่ดีกว่าในการกำหนดค่าคงที่สตริงซึ่งจะใช้ตลอดทั้งโปรแกรม อันไหนดีกว่า static const char * หรือ static const std::string constexpr ทำให้สิ่งใด ๆ ดีขึ้นกว่าการประกาศเก่าหรือไม่

static const char *str = "hello world";

vs

static const string str = "hello world";

เหตุใดฉันจึงต้องการสิ่งนี้: โปรแกรมของฉันต้องเริ่มต้นตัวแปรคงที่ประเภทสตริงตัวอักษรจำนวนมากก่อนที่จะเริ่มแอป และฉันไม่สามารถหลีกเลี่ยงตัวแปรคงที่ได้เนื่องจากใช้ในไฟล์ทั้งหมด หากฉันต้องเพิ่มประสิทธิภาพ แต่ลดเวลาในการเริ่มต้นตัวแปรคงที่ ตามหลักการแล้ว ฉันต้องการให้สิ่งต่าง ๆ ส่วนใหญ่เกิดขึ้นในเวลาคอมไพล์มากกว่ารันไทม์ อันไหนจะเป็นตัวเลือกที่ดีกว่า?


person venkat satish Katta    schedule 09.04.2019    source แหล่งที่มา
comment
การใช้สแตติกที่นี่คืออะไร?   -  person Michael Chourdakis    schedule 09.04.2019
comment
ดีกว่าด้วยความเคารพอะไร? การทำงานร่วมกันกับ c หรือในแง่ของการหลีกเลี่ยงการเข้าถึงนอกขอบเขต? ;)   -  person 463035818_is_not_a_number    schedule 09.04.2019
comment
ขึ้นอยู่กับสิ่งที่คุณกำลังทำอะไรกับมัน   -  person François Andrieux    schedule 09.04.2019
comment
สิ่งสำคัญคือคุณต้องการให้สตริงทำอะไร? คุณจะต้องได้รับความยาวหรือไม่? คุณต้องการความสะดวกสบายของ string.length() หรือคุณต้องการใช้ strlen() สำหรับเรื่องนั้น คุณสามารถ #define STRCONST1 "My String Const" และอื่นๆ ขึ้นอยู่กับว่าคุณต้องการใช้มันอย่างไรตลอดทั้งโค้ดของคุณ แน่นอนว่า char * จะมีคอมไพเลอร์และทรัพยากรน้อยกว่า และ #define จะน้อยกว่านั้นด้วยซ้ำ แต่ std::string ก็ไม่ได้ให้อะไรมากมายโดยมีค่าใช้จ่ายเพิ่มเติมเพียงเล็กน้อย   -  person David C. Rankin    schedule 09.04.2019
comment
คุณลืม string_view ซึ่งแทนที่ const char* ใน C++ สมัยใหม่ (และอันไหนใช้ได้กับ constexpr ซึ่งคุณควรใช้ในกรณีนั้น)   -  person Matthieu Brucher    schedule 09.04.2019
comment
@ DavidC.Rankin ฉันไม่ต้องการ strlen() โดยส่วนใหญ่แล้วจะใช้เพื่อเปรียบเทียบกับสตริงอื่นหรือสร้างออบเจ็กต์สตริงใหม่ด้วยตัวแปรนี้   -  person venkat satish Katta    schedule 09.04.2019
comment
@MatthieuBrucher, string_view คือ c++17 เราใช้ c++14   -  person venkat satish Katta    schedule 09.04.2019
comment
@ user463035818 หลีกเลี่ยงความล่าช้าของเวลาเริ่มต้นของแอป เนื่องจากตัวแปรคงที่จะเริ่มต้นก่อนที่แอปจะเริ่มทำงาน   -  person venkat satish Katta    schedule 09.04.2019
comment
ในส่วนที่สอง คุณกำลังกำหนด char const* ให้กับ std::string ทำไมไม่ใช้ไวยากรณ์ใหม่ที่อนุญาตให้คุณระบุตัวอักษร std::string static const string str = "hello world"s; (หมายเหตุตัวสุดท้าย) en.cppreference.com/w /cpp/string/basic_string/operator%22%22s   -  person Martin York    schedule 09.04.2019


คำตอบ (5)


โดยปกติแล้ว std::string ถือว่าดี แต่อย่างไรก็ตาม ขึ้นอยู่กับสิ่งที่คุณต้องการทำ ไม่มีกระสุนเงินที่แน่นอนที่นี่ std::string มีตัวสร้างและจะเรียก new/malloc เช่น (เมื่อไม่สามารถใช้การปรับสตริงขนาดเล็ก SSO ได้) หากสิ่งนี้ไม่พึงประสงค์ไม่ว่าด้วยเหตุผลใดก็ตาม ให้ใช้ const char*

มันขึ้นอยู่กับว่าจะใช้ที่ไหนด้วย หากนี่คือชื่อหน้าต่าง HWND และการใช้งานหลักคือกับฟังก์ชัน Windows API มันจะไม่แตกต่างหากคุณใช้เมธอด c_str() ของ std::string ตลอดเวลา

ทั้งหมดนี้เป็นการแนะนำว่าไม่มีการตั้งค่าอย่างใดอย่างหนึ่ง 100%

การใช้หรือไม่ใช้ static เป็นการสนทนาที่แตกต่างกัน

person Michael Chourdakis    schedule 09.04.2019
comment
โปรแกรมของฉันอาจต้องเริ่มต้นตัวแปรสแตติกชนิดสตริงตัวอักษรจำนวนมากก่อนที่จะเริ่ม main และฉันไม่สามารถหลีกเลี่ยงตัวแปรคงที่ได้เนื่องจากใช้ในไฟล์ทั้งหมด - person venkat satish Katta; 09.04.2019
comment
std::string has a constructor and will call new/malloc for example ข้อความนั้นไม่ถูกต้อง การใช้งานสมัยใหม่ทุกครั้งจะใช้ SSO (การเพิ่มประสิทธิภาพสตริงขนาดเล็ก) ซึ่งจัดเก็บไว้ในสแต็ก - person KostasRim; 10.04.2019

มันจะขึ้นอยู่กับสิ่งที่คุณทำกับตัวแปรเหล่านี้ ตัวอย่างเช่น ลองดูที่นี้:

void do_stuff(std::string const&);

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

ลองใช้สองวิธีในการกำหนดตัวแปร constant:

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

ในกรณีของ hot loop หากคุณใช้ (1) มันจะสร้างสตริงในแต่ละครั้ง หากค่าสตริงยาวเพียงพอ อาจทำให้เกิดการจัดสรรได้ ถ้าอย่างนั้น (2) จะดีกว่าสำหรับกรณีนั้น

ในทางกลับกัน หากคุณปรับโครงสร้างโค้ดของคุณใหม่เป็นดังนี้:

void do_stuff(std::string_view);

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

จากนั้นโปรแกรมของคุณจะเร็วขึ้นมากด้วย (1) เนื่องจากจะไม่มีการจัดสรรแบบไดนามิกเกิดขึ้น โปรแกรมของคุณจะอ้างอิงถึงข้อมูลต้นฉบับแบบอ่านอย่างเดียวของโปรแกรมของคุณ

person Guillaume Racicot    schedule 09.04.2019

ด้วยความทันสมัย ​​C++ ฉันจะใช้ std::string_view

หากคุณต้องการให้เป็น std::string ตัวเลือกที่ดีที่สุดคือกำหนดให้มันเป็นตัวแปรโลคอลแบบคงที่ในฟังก์ชัน ดังนั้นจึงเริ่มต้นอย่างเกียจคร้านเมื่อมีการร้องขอครั้งแรก

/* inline or not */
std::string const& get_that_string() {
    static std::string const str { "value" };
    return value;
}
person bobah    schedule 09.04.2019
comment
วิธีการนี้อาจไม่ขยายขนาด หากมีตัวแปรคงที่ในจำนวนที่ดี ฟังก์ชั่นการเขียนสำหรับทุกสิ่งอาจจะเกินความจำเป็น - person venkat satish Katta; 09.04.2019
comment
ใช้ string_view แล้ว - person bobah; 09.04.2019

ยกเว้นกรณีที่ทราบปัญหาในฐานโค้ดเฉพาะของคุณเกี่ยวกับการใช้ std::string ฉันขอแนะนำอย่างยิ่งให้ใช้ std::string

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

โดยทั่วไปคุณควรเลือก std::string มากกว่า char* staticไม่เกี่ยวอะไรกับมัน

person Code-Apprentice    schedule 09.04.2019
comment
คำถามเกี่ยวกับการประกาศตัวแปรคงที่...ดังนั้น static มีส่วนเกี่ยวข้องกับมันบ้าง ;) - person 463035818_is_not_a_number; 09.04.2019