2012-01-16 7 views
5

Tại công ty của tôi, gần đây chúng tôi đã chuyển từ VC9 sang VC10.Có phải pha trộn thời gian hoạt động là giải pháp khả thi không?

Chúng tôi di chuyển các dự án của mình nhưng sau đó, người phụ trách nói với chúng tôi rằng chúng tôi sẽ phải giữ một số DLL cơ bản được biên dịch với VC9 trên máy sản xuất của chúng tôi trong một thời gian.

Các tệp DLL này sử dụng các cấu trúc tùy chỉnh, một số trong đó chứa cấu trúc std::vector, std::map v.v. Bây giờ, nó đã đến sự chú ý của tôi rằng kích thước của container tiêu chuẩn thay đổi: một số đã lớn hơn, một số đã nhỏ hơn. Kết quả là, kích thước của cấu trúc tùy chỉnh của chúng tôi cũng thay đổi.

Để giải quyết các vấn đề gây ra bởi thay đổi kích thước, đồng nghiệp của tôi nghĩ tăng kích thước của cấu trúc của chúng tôi để bù đắp cho các thay đổi kích thước thành viên trong tương lai. sử dụng, ngăn chặn tham nhũng ngăn xếp trên các cuộc gọi chức năng.

Cá nhân, tôi cảm thấy rằng "giải pháp" này là khủng khiếp bởi vì trong khi kích thước quan trọng thì bố cục của cấu trúc cũng vậy. Với tôi, việc tăng dung lượng bộ nhớ của tất cả các cấu trúc để khắc phục các vấn đề về tổ chức có vẻ thực sự sai.

Để làm cho nó ngắn gọn, câu hỏi của tôi là: thậm chí có thể sử dụng đồng thời hai thời gian khác nhau (sử dụng thủ thuật được mô tả hoặc bất kỳ thủ thuật nào khác) trong khi sử dụng các loại không C trong nguyên mẫu hàm? Bạn có bất kỳ kinh nghiệm tốt/xấu về một tình huống tương tự?

Trả lời

9

STL không bao giờ đảm bảo khả năng tương thích nhị phân giữa các phiên bản chính khác nhau. Vì vậy, nếu bạn có DLL với các lớp STL tại giao diện, bạn nên sử dụng trình biên dịch tương tự và cùng một hương vị của CRT cho khách hàng của DLL và bản thân DLL.

Nếu bạn muốn xây dựng DLL có thể được sử dụng một cách an toàn với các phiên bản trình biên dịch khác nhau, bạn có một số tùy chọn, như:

  1. Expose một tinh khiết giao diện C (DLL có thể được viết bằng C++, nhưng giao diện phải là thuần túy C, và ngoại lệ C++ không thể vượt qua ranh giới DLL).
  2. Hiển thị giao diện trừu tượng tại giao diện DLL, như được giải thích trong số article này.
  3. Sử dụng COM.
+0

'1.' không phải là một tùy chọn, nhưng' 2.' có thể hoạt động tốt. Cảm ơn bạn rất nhiều vì bài viết được liên kết. – ereOn

+0

@ereOn: Bạn được chào đón. –

1

Bạn phải đảm bảo rằng mọi thứ cần sử dụng các thư viện cũ đều được liên kết với chúng và được biên dịch dựa trên các tệp tiêu đề đi kèm với phiên bản đó của các thư viện đó. Không có cách nào khác để làm điều đó, bởi vì C++ có thể xem các tập tin tiêu đề để biết làm thế nào để giải quyết bất kỳ cấu trúc dữ liệu nào.

Tôi nhận được ấn tượng từ câu hỏi của bạn rằng bạn sẽ liên kết với một số thư viện được biên dịch và liên kết với thời gian chạy VC9, trong trường hợp này có thể liên kết phần còn lại của mã với VC10, miễn là các thư viện không trưng ra bất kỳ loại thư viện VC9 nào trong các giao diện của chúng. Tôi nói 'cũng có thể là', đây là một khu vực đầy những cạm bẫy và bẫy và nói chung tôi sẽ nói rằng bạn nên sử dụng cùng một thời gian chạy trong suốt bất cứ khi nào có thể. Điều cuối cùng bạn cần là trình biên dịch bị nhầm lẫn với phiên bản std :: vector mà bạn đang nói đến (và bạn có thể đảm bảo rằng các lập trình viên sẽ bị lẫn lộn ngay cả khi bạn có thể thuyết phục trình biên dịch và trình liên kết tìm ra nó) .

Đó là nastier, nhưng nó dễ dàng hơn, chỉ cần dính vào thời gian chạy cũ cho đến khi thời gian như nó không cần thiết trên bất kỳ máy mục tiêu nữa.

+0

Cảm ơn bạn đã trả lời. Chúng tôi đã di chuyển tất cả các cơ sở mã của chúng tôi sang VC10, và cũng giống như tình huống không phải là điên rồ, kiểm soát phiên bản nguồn của chúng tôi (VSS) làm cho nó rất khó, nếu không phải là không thể, Không phải là một lựa chọn nữa :( – ereOn

+0

Đó thực sự không phải là tính năng mong đợi của hệ thống điều khiển phiên bản. Tôi cảm thấy cho bạn, tôi nghĩ rằng giải pháp kiểm soát phiên bản của chúng tôi ở đây thậm chí còn tồi tệ hơn, đó là cách quá enterprisey để làm những việc như hoàn nguyên, phân nhánh –

+1

Bởi 'enterprisey' ở đó bạn có nghĩa là 'cũ và hầu như không hoạt động', phải không? VSS thực sự là khủng khiếp, tôi thông cảm. Có vẻ như bạn đang ở trong một tình huống khó chịu. –

1

Tôi đã thực sự thực hiện việc này trước đây, cấu trúc đệm theo cách tương tự. Có, bạn có thể sử dụng hai thời gian chạy khác nhau và nó sẽ hoạt động tốt miễn là ABI giống nhau: đây là nơi bạn sẽ nhấn tường khi cấu trúc bắt đầu thay đổi kích cỡ và di chuyển C++ (trong đó ABI ở khắp nơi) Ranh giới DLL thực sự, thực sự lộn xộn. Đặc biệt, VC10 có một vài thay đổi với dự đoán của C++ 11. Tôi sử dụng C, nơi DLL có liên quan, hoàn toàn cho các bảo đảm nó mang lại cho tôi về khả năng tương thích nhị phân. Thật khó cho tôi để cung cấp một trường hợp cụ thể nơi mọi thứ sẽ thực sự ăn nó, nhưng hãy để tôi đặt nó cho bạn theo cách này: Đó là lỗi bạn không lường trước sẽ giúp bạn có được, và đây là một tổ ong thực sự .