Tôi gặp vấn đề với đường vòng. Đường vòng, như bạn đã biết, chỉ có thể di chuyển giữa 5 byte không gian (ví dụ: cuộc gọi 'jmp' và địa chỉ 4 byte). Bởi vì điều này là không thể có chức năng 'móc' trong một lớp (một phương pháp), bạn không thể cung cấp con trỏ 'này' vì đơn giản là không đủ không gian (here's vấn đề được giải thích kỹ lưỡng hơn). Vì vậy, tôi đã động não cả ngày cho một giải pháp, và bây giờ tôi muốn suy nghĩ của bạn về chủ đề này vì vậy tôi không bắt đầu một dự án 3-5 ngày mà không biết nếu nó sẽ có thể hay không.C++ và HOÀN TOÀN chức năng động
Tôi đã có 3 mục tiêu ban đầu, tôi muốn các hàm 'móc' là các phương thức lớp, tôi muốn toàn bộ phương pháp tiếp cận hướng đối tượng (không có hàm tĩnh hoặc đối tượng chung) và phần tồi tệ nhất hoàn toàn năng động. Đây là giải pháp (theo lý thuyết) của tôi; với một assembly có thể sửa đổi các hàm trong thời gian chạy (ví dụ hoàn hảo là bất kỳ phương thức tẩy rửa nào). Vì vậy, kể từ khi tôi có thể sửa đổi các chức năng tự động, tôi không nên cũng có thể tạo chúng một cách năng động? Ví dụ; Tôi phân bổ bộ nhớ cho, hãy nói ~ 30 byte (thông qua malloc/mới). Nó sẽ không thể chỉ thay thế tất cả các byte với số nhị phân tương ứng với các nhà khai thác lắp ráp khác nhau (như 0xE9 là 'jmp') và sau đó gọi địa chỉ trực tiếp (vì nó sẽ chứa một chức năng)? Chú ý: Tôi biết trước về giá trị trả về, và tất cả các đối số cho tất cả các hàm mà tôi muốn đi vòng, và vì tôi đang sử dụng GCC, quy ước thiscall thực tế giống với _cdecl.
Vì vậy, đây là suy nghĩ của tôi/sẽ sớm được triển khai; Tôi tạo ra một lớp 'Chức năng'. Hàm khởi tạo này lấy một số đối số variadic (trừ đối số đầu tiên, trong đó mô tả giá trị trả về của hàm đích).
Mỗi đối số là một mô tả về các đối số móc sẽ nhận được (kích thước và cho dù đó là con trỏ hay không). Vì vậy, hãy nói rằng tôi muốn tạo ra một lớp chức năng cho một int * RandomClass::IntCheckNum(short arg1);
. Sau đó, tôi sẽ phải làm như thế này: Function func(Type(4, true), Type(4, true), Type(2, false));
. Trường hợp 'Loại' được định nghĩa là Type(uint size, bool pointer)
. Sau đó, thông qua lắp ráp tôi có thể tự động tạo ra các chức năng (lưu ý: điều này tất cả sẽ được sử dụng quy ước gọi _cdecl) kể từ khi tôi có thể tính toán số lượng các đối số và tổng kích thước.
EDIT: Với ví dụ này, Type(4, true)
là giá trị trả về (int *), các scond Type(4, true)
là RandomClass 'này' con trỏ và Type(2, false)
mô tả các đối số đầu tiên (arg1 ngắn).
Với việc triển khai này, tôi có thể dễ dàng có các phương thức lớp như gọi lại, nhưng nó đòi hỏi một số lượng lớn mã lắp ráp (mà tôi thậm chí không có kinh nghiệm đặc biệt). Cuối cùng, điều không động duy nhất sẽ là các phương thức trong lớp gọi lại của tôi (cũng sẽ yêu cầu các cuộc gọi lại trước và sau).
Vì vậy, tôi muốn biết; điều này có thể không? Tôi cần bao nhiêu công việc và tôi có thể vượt qua đầu mình ở đây không?
EDIT: Tôi xin lỗi nếu tôi trình bày mọi thứ hơi mờ, nhưng nếu có điều gì đó bạn muốn giải thích kỹ lưỡng hơn, hãy hỏi!
EDIT2: Tôi cũng muốn biết, nếu tôi có thể tìm giá trị hex cho tất cả các toán tử lắp ráp ở đâu đó? Một danh sách sẽ giúp một tấn! Và/hoặc nếu có thể bằng cách nào đó 'tiết kiệm' asm (""); mã tại một địa chỉ bộ nhớ (mà tôi rất nghi ngờ).
Tại sao nên sử dụng đường vòng? Bạn không thể sử dụng một giải pháp C++ thuần túy như 'std :: function' hay tôi thiếu một cái gì đó? –
Không giống như tôi có thể giúp bạn chỉ để làm rõ mọi thứ. Bạn muốn hàm có thể ghi lại trong lớp? (Tôi có nghĩa là bạn có thể thay đổi chúng khi đang chạy) Nếu đó là vì vậy tôi nghĩ rằng (khi hoàn thành) có thể mở ra cơ hội khổng lồ cho lập trình AI trong C++. +1 – akaltar
@akaltar Điều này được gọi là [lập trình di truyền] (http://en.wikipedia.org/wiki/Genetic_programming) và không thực sự cần chức năng ghi lại. –