Files
cKit/Foundation/c_Swap.h
T

48 lines
1.4 KiB
C
Raw Normal View History

2026-08-30 22:24:45 +08:00
#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*/