#ifndef INCLUDED_C_SWAP_H #define INCLUDED_C_SWAP_H #ifndef INCLUDED_C_TYPES_H #include #endif /*INCLUDED_C_TYPES_H*/ /* ------------------------------------------------------------------------------------------------------------------ */ /* */ /** * @brief 泛型就地内存块数据互换接口 * * @param a 指向第一个待交换对象的泛型指针 * @param b 指向第二个待交换对象的泛型指针 * @param size 待交换对象占用的内存字节大小 (sizeof) */ C_STATIC_FORCE_INLINE void c_Swap(void* a, void* b, c_size_t size) { // 边界与自等性防御:指针无效、长度为0、或者两个指针指向同一个内存物理地址时无需交换 if (!a || !b || size == 0 || a == b) { return; } char* p1 = (char*)a; char* p2 = (char*)b; // 在栈上开辟一个小缓冲区。256 字节足以一次性吃下绝大多数基本类型和中小型结构体 char temp_buf[256]; c_size_t bytes_left = size; // 分块拷贝机制:无视对象体量,即便面临超出 256 字节的巨型结构体也能安全互换 while (bytes_left > 0) { const c_size_t chunk = (bytes_left < sizeof(temp_buf)) ? bytes_left : sizeof(temp_buf); memcpy(temp_buf, p1, chunk); memcpy(p1, p2, chunk); memcpy(p2, temp_buf, chunk); p1 += chunk; p2 += chunk; bytes_left -= chunk; } } #endif /*INCLUDED_C_SWAP_H*/