Ví dụ về chuỗi Constexpr trong C++

Vi Du Ve Chuoi Constexpr Trong C



Bài viết này sẽ thảo luận về constexpr, một bổ sung đáng chú ý cho ngôn ngữ lập trình C++ được giới thiệu trong C++ 11 và được nâng cao hơn nữa trong C++ 14, đồng thời báo hiệu cho trình biên dịch rằng một hàm tạo biến, hàm hoặc đối tượng là một trình biên dịch- thời gian cố định. Nó cách mạng hóa cách các nhà phát triển tạo và thao tác với các hằng số. Thông qua constexpr, các nhà phát triển có thể xác định các biểu thức và giá trị bất biến và được đánh giá trong quá trình biên dịch thay vì trong thời gian chạy. Lợi ích bao trùm của việc kết hợp constexpr vào mã là đảm bảo tính nhất quán của nó.

Việc sử dụng chuỗi Constexpr C++ là gì?

Việc sử dụng constexpr có thể dẫn đến các tệp thực thi nhỏ gọn và tối ưu hơn. Do các giá trị được trình biên dịch xác định trước nên các tệp nhị phân thu được có thể có kích thước nhỏ hơn, giúp sử dụng tài nguyên hệ thống tiết kiệm hơn, từ đó có thể nâng cao hiệu suất của phần mềm trên nhiều nền tảng khác nhau. Một ưu điểm đặc biệt quan trọng của tính năng này là nó giúp giảm thiểu việc tính toán trong thời gian chạy. Vì các giá trị được tính toán trong quá trình biên dịch bất cứ khi nào khả thi nên việc đánh giá thời gian chạy trở nên ít cần thiết hơn. Việc tăng cường hiệu quả này không chỉ đẩy nhanh quá trình thực thi mà còn hợp lý hóa các hoạt động chung của chương trình.

Ví dụ 1: Sử dụng Constexpr trong C++ để tính giai thừa

Trong ví dụ này, chúng tôi sẽ sử dụng constexpr cho phép tính toán được thực hiện tại thời gian biên dịch thay vì thời gian chạy. Trong bối cảnh tính toán giai thừa, một phép toán phổ biến, đó là constexpr, có thể được tận dụng để tính các giá trị giai thừa trong quá trình biên dịch. Hãy cùng kiểm tra và xem lại đoạn mã sau, sau đó xem phần giải thích về mã:







#include

constexpr int yếu tố ( int N ) {

trở lại N <= 1 ? 1 : ( N * yếu tố ( N - 1 ) ) ;

}

int chủ yếu ( ) {

int trên một = 5 ;

tiêu chuẩn :: cout << 'Hệ số của' << trên một << ' = ' << yếu tố ( trên một ) << tiêu chuẩn :: kết thúc ;

}

Ví dụ mã đã cho minh họa cách sử dụng constexpr để tính giai thừa của một số theo cách đệ quy. Trình biên dịch có thể đánh giá biểu thức giai thừa tại thời điểm biên dịch trong ví dụ này vì hàm giai thừa được khai báo và định nghĩa bằng trình xác định constexpr. Sử dụng constexpr trong chương trình C++, trình biên dịch sẽ đánh giá biểu thức giai thừa của 5 tại thời điểm biên dịch, loại bỏ nhu cầu tính toán thời gian chạy.



Bây giờ, chúng ta hãy xem phân tích chi tiết về mã với các chi tiết và giải thích cụ thể.



Đầu tiên, chúng tôi sử dụng #include để kết hợp tệp tiêu đề “iostream” cung cấp các chức năng đầu vào và đầu ra thiết yếu như “std::cout” để in ra bảng điều khiển.





Sau đó, chúng ta chuyển sang hàm giai thừa () (đệ quy) là “constexpr int giai thừa(int n)”. Hàm giai thừa () này xác định hàm đệ quy tính giai thừa của số nguyên “n”. Constexpr ngụ ý rằng việc tối ưu hóa hiệu suất có thể là kết quả của việc đánh giá hàm trong quá trình biên dịch.

Trả về n <= 1? Dòng 1 : (n * giai thừa(n – 1)) sử dụng biểu thức điều kiện cho đệ quy trong đó nêu rõ rằng nếu “n” nhỏ hơn hoặc bằng 1 thì nó sẽ trả về 1 (trường hợp cơ sở). Nếu không, nó sẽ thực hiện phép tính giai thừa (n! = n * (n-1)!), đây là công thức chung để tính giai thừa, bằng cách liên tục gọi chính nó bằng “n – 1” rồi nhân kết quả với “n ”. Những dòng này hoạt động như một người gác cổng để tính giai thừa. Nó kiểm tra xem số đó có ở mức cơ sở hay không và trả về 1 nếu có. Nếu không, nó sẽ khởi động một phản ứng dây chuyền của các lệnh gọi hàm, mỗi lệnh sẽ hoạt động trên các số nhỏ hơn cho đến khi đạt được trường hợp cơ sở. Sau đó, các kết quả được nhân với nhau theo thứ tự ngược lại. Sau đây là đầu ra của mã để bạn tham khảo:



Ví dụ 2: Đếm chữ thường thể hiện chuỗi Constexpr C++

Ở đây, chúng ta sẽ tìm hiểu cách đếm số lượng chữ cái viết thường bằng chuỗi countexpr. Trong ví dụ này, mục đích là đếm số chữ cái viết thường trong một chuỗi nhất định bằng cách sử dụng tính năng constexpr để giảm thời gian tính toán trong thời gian chạy. Hàm countLowercase(), được khai báo là constexpr, lấy chuỗi “string_view” làm tham số và lặp qua từng ký tự của chuỗi đã cho làm đầu vào. Đối với mỗi chữ cái viết thường mà chúng ta gặp, số lượng sẽ tăng lên. Sau đó, kết quả sẽ thu được tại thời điểm biên dịch khi hàm hoạt động trên các biểu thức không đổi, thể hiện tính hiệu quả và lợi ích về hiệu suất của việc đánh giá tại thời điểm biên dịch. Đầu tiên, hãy kiểm tra đoạn mã sau. Sau đó, chuyển sang phần giải thích chi tiết:

#include
#include
sử dụng không gian tên std ;
constexpr kích thước_t đếmChữ thường ( chuỗi_view s ) {
kích thước_t đếm = 0 ;
( ký tự c : S ) {
nếu như ( thấp hơn ( c ) ) {
đếm ++;
}
}
trở lại đếm ;
}
int chủ yếu ( ) {
cout << 'Tổng số chữ thường trong ' Chữ viết thường ' là = '
<< đếmChữ thường ( 'Chữ viết thường' ) << kết thúc ;
}

Dưới đây là bản phân tích chi tiết về mã kèm theo lời giải thích cho từng dòng:

#include được bao gồm để sử dụng thư viện luồng đầu vào/đầu ra tiêu chuẩn nhằm in thông báo. #include bao gồm lớp “string_view” để thao tác chuỗi hiệu quả.

Trong hàm countLowercase(), hàm “constexpr size_t countwer(string_view s)”, đếm các chữ cái viết thường trong chế độ xem chuỗi nhất định. int main() là điểm vào của chương trình in một thông báo cho biết số lượng chữ cái viết thường trong “LoWeR CaSe LeTtErS” và gọi hàm countLowercase() với “LoWeR CaSe LeTtErS” làm đầu vào và in kết quả. Tham khảo đầu ra sau của chương trình:

Ví dụ 3: Trình diễn mảng bằng cách sử dụng C++ Constexpr

Trình diễn mảng cho thấy cách các mảng là tập hợp có cấu trúc của các phần tử thuộc cùng loại dữ liệu được tạo, truy cập và thao tác trong ngôn ngữ lập trình. Sau đây, chúng tôi sẽ giải thích thông qua một ví dụ mã hóa trong đó chương trình cung cấp một ví dụ đơn giản về khởi tạo và thao tác mảng thời gian biên dịch.

Phần minh họa mảng minh họa khái niệm mảng—một tập hợp có cấu trúc gồm các phần tử có chung kiểu dữ liệu—và cách chúng có thể được tạo, truy cập và thao tác bằng ngôn ngữ lập trình. Trong ví dụ mã hóa sau đây, chúng tôi sẽ trình bày cách khởi tạo một mảng tại thời điểm biên dịch, tính toán kích thước của nó và in các phần tử của mảng đã cho. Xem đoạn mã đã cho sau đây và tiến hành giải thích:

#include
sử dụng không gian tên std ;
int chủ yếu ( ) {
constexpr int mảng int [ 9 ] = { 5 , 55 , 555 , 5555 , 55555 } ;
constexpr int mảng kích thước = kích thước của mảng int / kích thước của ( int ) ;
cout << 'Độ dài của mảng là =' << mảng kích thước << kết thúc ;
cout << 'Các phần tử trong mảng là =' ;
( int Tôi = 0 ; Tôi < mảng kích thước ; ++ Tôi ) {
cout << mảng int [ Tôi ] << '' ;
}
}

Chương trình này khởi tạo một mảng constexpr, tính toán độ dài của nó tại thời điểm biên dịch, sau đó in độ dài và các phần tử của mảng ra bảng điều khiển. Constexpr đảm bảo rằng mảng và các thuộc tính của nó được xác định tại thời điểm biên dịch. Hãy phá mã và giải thích từng chi tiết cụ thể:

Để bao gồm thư viện luồng đầu vào-đầu ra tiêu chuẩn, cho phép sử dụng các hàm như “cout” cho đầu ra, #include được gọi. Chương trình bắt đầu thực thi từ hàm int main(). Trong hàm main(), mảng “arrayint[]” được xác định, có kích thước là 9 với câu lệnh constexpr int arrayint[9]. Mảng được khởi tạo với năm số và các phần tử còn lại mặc nhiên giữ nguyên bằng 0. int length_a = sizeof arrayint / sizeof(int); tính toán kích thước của “arrayint” theo byte.

Vòng lặp “for” lặp qua các phần tử của mảng “arrayint[]” và sau đó các giá trị được in ra bảng điều khiển. Chúng ta hãy xem đầu ra sau của mã đã cho:

Phần kết luận

Sự ra đời và phát triển của từ khóa constexpr trong C++ đã cách mạng hóa cách xử lý các biểu thức và giá trị hằng số. Bài viết này khám phá ba ví dụ thực tế, thể hiện sức mạnh của constexpr trong tính toán giai thừa, đếm các chữ cái viết thường và khởi tạo mảng tại thời điểm biên dịch. Những điểm đáng chú ý bao gồm hiệu suất được nâng cao, tính toán thời gian chạy giảm và hiệu suất bộ nhớ được cải thiện. Constexpr là tài sản có giá trị để tạo ra các thực thể ổn định, đáng tin cậy trong cơ sở mã, đảm bảo tính bất biến và đóng góp cho các chương trình hợp lý và hiệu quả hơn.