48 lines
1.4 KiB
C
48 lines
1.4 KiB
C
#ifndef INCLUDED_C_SWAP_H
|
|
#define INCLUDED_C_SWAP_H
|
|
|
|
#ifndef INCLUDED_C_TYPES_H
|
|
#include <c_Types.h>
|
|
#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*/
|