2013-10-10 14 views
7

Ví dụ, nếu bạn có một chương trìnhChuẩn C++ có đảm bảo rằng các chuỗi ký tự chuỗi được lưu trữ trong chương trình nhị phân không được pha trộn?

int main() 
{ 
    const char* str = "1111111111111111111111111111111111111111111"; 
    printf("%s", str); 

    return 0; 
} 

và bạn biên dịch nó, nếu bạn tìm kiếm nhị phân tạo ra cho "1111111111111111111111111111111111111111111", (bỏ qua các vấn đề như mã hóa), bạn có đảm bảo để tìm thấy nó, hoặc là nó cho phép trình biên dịch tạo mã, ví dụ, phân bổ bộ nhớ heap, điền nó với '1's bằng cách sử dụng một vòng lặp, và sau đó sửa tất cả các tham chiếu đến chuỗi ký tự đó để trỏ tới bộ nhớ heap? (và sau đó đảm bảo rằng nó được deallocated vào đúng thời điểm, blah blah)

Tôi nghi ngờ có bất kỳ thực hiện thực sự làm điều này ... nhưng nó sẽ là tiêu chuẩn phù hợp nếu nó đã làm?

+0

Không có gì đảm bảo điều đó. Điều duy nhất tiêu chuẩn (Tôi đang xem bản thảo năm 2005 vì không ai không có tiền cho sách giáo khoa ...) là nội dung của các chuỗi ký tự (chúng hẹp hoặc rộng), loại của chúng, thời gian lưu trữ của chúng , thoát chuỗi và nối chuỗi chữ liền kề. Xem [2.13.4 tại đây] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf). –

Trả lời

10

C++ không có bất kỳ khái niệm nào về "nhị phân chương trình", do đó câu hỏi không thực sự hợp lý.

Đảm bảo rằng bạn nhận được tất cả các ký tự trong chuỗi bằng cách tăng và dereferencing con trỏ str, tức là chuỗi của bạn được lưu trữ liên tục trong bộ nhớ khi chương trình đang chạy.

+2

Và đảm bảo đó chỉ được thực hiện * nếu * bạn thực sự làm điều đó (hoặc đúng hơn là trình biên dịch không thể chứng minh, lên đến hành vi không xác định, bạn đã không làm điều đó), theo nguyên tắc as-if. Điều gì sẽ xảy ra khi (nói) một chương trình bên ngoài kiểm tra bộ nhớ của tệp thực thi của bạn không được xác định theo tiêu chuẩn C++. – Yakk

0

Tôi không nghĩ có lý do chính đáng nào để trình biên dịch thực hiện điều đó thay vì mã hóa nó trong chương trình đã biên dịch.

1

Không, tiêu chuẩn không cho biết vị trí và cách lưu trữ chuỗi ký tự. Đó là một chi tiết thực hiện.

+0

@Fabrizio Ý bạn là gì? Nó sẽ không bao giờ được lưu trữ trong std :: vector –

+0

@Fabrizio: Chúng chỉ là mảng. Nó giống như 'foo (" Hi ");' được thay thế bằng 'foo (__ literal0)', trong đó 'static const char __literal0 [] = {'H', 'i', '\ 0'};'. – GManNickG

1

Điều đó sẽ tùy thuộc vào trình biên dịch và kiến ​​trúc của máy tính mà mã đang được biên dịch. Tiêu chuẩn C++ không ảnh hưởng đến cách mã được lưu trữ ở định dạng nhị phân của nó.

3

Bộ nhớ nhị phân không bị ảnh hưởng bởi tiêu chuẩn C++

Các vấn đề liên quan