go面试3(内存对齐)
go面试3(内存对齐)
版权声明: 本文为 InfoQ 作者【PONPON】的原创文章。
原文链接:【https://xie.infoq.cn/article/594a7f54c639accb53796cfc7】。
本文是在拜读原文后,将原文出现的面试题加入自己的思考,做了一些转变,也补充了自己一些疑惑,剩余的知识点和原理跟原文一致,原文作者的编程思想之深令人佩服,深究语言源码的精神值得学习。
一、面试题
type S struct {A uint8 B uint32 C int16 D int64 E [2]string F struct{}
}
上面结构体所占内存是多少?(cpu为64位)
fun main(){fmt.Println(unsafe.Offsetof(S{}.B)) // 4fmt.Println(unsafe.Offsetof(S{}.C)) // 8fmt.Println(unsafe.Offsetof(S{}.D)) // 16fmt.Println(unsafe.Offsetof(S{}.E)) // 24fmt.Println(unsafe.Offsetof(S{}.F)) // 56fmt.Println(unsafe.Sizeof(S{}.F)) // 0fmt.Println(unsafe.Sizeof(S{})) // 64
}
二、分析
该面试题考察goland的<内存对齐>,从S的结构上看是8bytes对齐的,一般的回答可能是56bytes,因为从打印的S.F的偏移量看,是56byte,并且S.E的大小是0,但是最终的S却是64,所以必然有隐性的8bytes的padding,
为什么有这个padding,github上的大佬给出的解释是:"结构体尾部的size为0的变量(字段)会被分配内存空间进行填充,
如果不这么处理,改变量(字段)指针将会指向一个非法的内存空间,类似c/c++的野指针"
三、原理
1、术语
-
字(word):
是用于表示其自然的数据单位,也叫
machine word
。字是电脑用来一次性处理事务的一个固定长度。 -
字长:
一个字的位数,现代电脑的字长通常为 16、32、64 位。(一般 N 位系统的字长是
N/8
字节。)
2. 为什么要对齐
操作系统并非一个字节一个字节访问内存,而是按2, 4, 8
这样的字长来访问。因此,当CPU从存储器读数据到寄存器,或者从寄存器写数据到存储器,IO的数据长度通常是字长。如 32 位系统访问粒度是 4 字节(bytes),64 位系统的是 8 字节。
当被访问的数据长度为 n
字节且该数据地址为n
字节对齐,那么操作系统就可以高效地一次定位到数据,无需多次读取、处理对齐运算等额外操作。
数据结构应该尽可能地在自然边界上对齐。如果访问未对齐的内存,CPU需要做两次内存访问。
3、数据结构对齐
对于go数据类型的大小保证和对齐保证,官方文档如下图
翻译圈红的内容:如果结构或数组类型包含大小为零的字段(或元素),则其大小为零。 两个不同的零大小变量在内存中可能具有相同的地址。
大小保证
在go中,如果两个值的类型为同一种类的类型,并且他们的类型的种类不为接口
,数组
和结构体
,则这连个值的尺寸总是相等的
目前(go1.14),至少对于官方标准编译器来说,任何一个特定类型的所有值的尺寸都是相等的,所以我们也常说一个值的尺寸为此值的类型的尺寸
下表列出了各种种类的类型的尺寸(对标准编译器1.14来说):
一个结构体类型的尺寸取决于它的各个字段的类型尺寸和这些字段的排列顺序,为了程序执行性能,编译器需要保证某些类型的值在内存中存放时必须满足特定的内存地址对齐要求
。地址对齐可能会造成相邻的两个字段之间在内存中被插入填充一些多余的字节,所以,一个结构体类型的尺寸比定不小于(常常会大于)此结构体类型的各个字段的类型尺寸之和。
一个数组类型的尺寸取决于它的元素类型的尺寸和它的长度,它的尺寸为它的元素类型的尺寸和它的长度的乘积。
Struct{}和[0]T{}的大小为0;不同类型的大小为0的变量可能指向同一快地址。
对齐保证
官方文档中的对齐保证的要求只有如下解释谷歌翻译结果:(原文就是圈红部分的上面的三条)
- 对于任何类型的变量x,unsafe.Alignof(x)的结果最小为1;
- 对于结构类型的变量x:对于x的每个字段f,unsafe.Alignof(x)是所有值unsafe.Alignof(x.f)中的最大值,但至少为1。
- 对于数组类型的变量x:unsafe.Alignof(x)与数组元素类型的变量的对齐方式相同
类型对齐保证也称为值地址对齐保证
。如果一个类型T的对齐保证为N(一个正整数),则在运行时刻T类型的每个(可寻址的)值的地址都是N的倍数。我们也可以说类型T的值的地址保证为N字节对齐的。
事实上,每个类型有两个对齐保证,当它被用作结构体类型的字段类型时的对齐保证为次类型的字段对齐保证,其他情形的对齐保证称为此类型的一般对齐保证
对于一个类型T,我们可以调用unsafe.Alignof(t)来获得它的一般对齐保证,其中t为一个T类型的非字段值,也可以调用unsafe.Alignof(x.t)来获取T的字段对齐摆正,其中X为一个结构体质并且t为一个类型为T的结构体字段值。
在运行时刻,对于类型为T的一个值t,我们可以调用reflect.Typeof(t).Align()来获得类型T的一般对齐保证,也可以调用reflect.TypeOf(t).FieldAlign()来获得T的字段对齐保证
对于当前的官方go编译器(1.14版本),一个类型的一般对齐保证和字段对齐保证总是相等的。
重排优化
针对开头的面试体进行优化,减少内存占用
type S1 struct {A uint8 // 1 补3为4B uint32 // 4 A+B=8C int16 //2 补6为8D int64 //8E [2]string // 16*2=32 F struct{} //8
}type S2 struct {A uint8 // 1 补1为2B int16 //2 C uint32 //4 A+B+C=8D struct{} // 0E int64 // 8F [2]string // 16*2}
fmt.Printf("S2 sizeof: %d,alignof:%d\n",unsafe.Sizeof(S2{}),unsafe.Alignof(Sc{}))fmt.Printf("S1 sizeof: %d,alignof:%d\n",unsafe.Sizeof(S1{}),unsafe.Alignof(Sb{}))/*
S2 sizeof: 48,alignof:8
S1 sizeof: 64,alignof:8
*/
分析:S1和S2内字段的最大的都是int64,大小伟8bytes,对齐按机器字确定,64位下位 8Bytes,所以按8Bytes对齐
合理重排字段可以减少填充,是struct字段排列更紧密
零大小字段对齐
零大小字段(zero size field)是指struct{},大小为0,按理作为字段时不需要对齐,但当在作为结构体最后一个字段(final field)时需要对齐的。即开头的面试题,架设有指针指向这个final zero field,返回的地址将在结构体之外(即指向了别的内存),如果此指针一直存活不释放对应的内存,就会有内存泄漏的问题(该内存不因结构体释放而释放),go会对这种finam zero field也做填充,使之对齐。当然,有一种情况不需要对这个final zero field做额外填充,也就是这个末尾的上一个字段对齐,需要对这个字段进行填充时,final zero field就不需要再次填充,而是直接利用上一个字段的填充
type Sa struct { //24A uint64 //8B uint32 //4C int32 //4D int8 //1E struct{}
}
fmt.Printf("Sa sizeof: %d,alignof:%d\n",unsafe.Sizeof(Sa{}),unsafe.Alignof(Sa{}))// 假如这个 E 不是struct{},而是 [0]int32 或者 [0]int64,那 unsafe.Sizeof(S{}) 会是多少呢?
// 大小不变
四、总结
- 内存对齐是为了让cpu更高效的访问内存中的数据
- struct的对齐是:如果类型t的对齐保证是n,那么类型t的每个值的地址在运行时必须是n的倍数
- struct内字段如果填充过多,可以尝试重排,使字段排列更紧密,减少内存浪费
- 零大小字段要避免作为struct最后一个字段,会有内存浪费
- 32位系统上对64位字的原子访问要保证其是8bytes对齐的;当让如果不必要的话,还是用加锁(mutex)的方式更清晰简单
五、面试题拓展
// 连续声明两个Sa的变量s1,s2,那么s2的内存地址是怎样的?
type Sa struct { //24A uint64 //8B uint32 //4C int32 //4D int8 //1E struct{}
}
var s1,s2 Sa
fmt.Printf("S1.E offsetof:%d,s1.E sizeof:%d, s1 sizeof:%d, s1.A address:%v",unsafe.Offsetof(s1.E),unsafe.Sizeof(s1.E),unsafe.Sizeof(s1), &s1.A)fmt.Printf("S1.E offsetof:%d,s1.E sizeof:%d, s1 sizeof:%d, s1.A address:%v\n", unsafe.Offsetof(s2.E),unsafe.Sizeof(s2.E), unsafe.Sizeof(s2), &s2.A)
ptr1 := uintptr(unsafe.Pointer(&s1))
ptr2 := uintptr(unsafe.Pointer(&s2))
fmt.Println(ptr2-ptr1) //32
/*
S1.E offsetof:17,s1.E sizeof:0, s1 sizeof:24, s1.A address:0x11a6cd0
S1.E offsetof:17,s1.E sizeof:0, s1 sizeof:24, s1.A address:0x11a6cf0
*/
因为s1和s2在内存上是连续的,我们也知道s1的内存是24,那么问什么s2的地址相对s1的地址偏移量却是32呢?(0x11a6cf0-0x11a6cd0=32)
原因是
:
因为对于s1这个对象,它的大小是24bytes,而go在内存分配时,会冲span种拿大于或等于40的最小的span中的一个快给这个对象,二sizeclass中这个快的大小值为32,所以虽然s1的大小是24bytes,但是实际分配给这个对象的内存大小是48
补充知识点:
go的内存分配,首先是按照sizeclass
划分span,然后每个span中的page
又分成一个个小格子(大小相同的对象object
)
span
是golang内存管理的基本单位,是由一片连续的8kb
(golfing page
的大小)的页组成的大块内存
如图,span
由一组连续的页组成,按照一定大小划分成object
每个span
管理指定规格(golang中的page为单位)的内存快,内存池分配出不同规格的内存快就是通过span体现出来的,应用程序创建对象就是通过找到对应规格的span
来存储的,下面是mspan
结构中的主要部分。
type mspan struct {next *mspan // next span in list, or nil if noneprev *mspan // previous span in list, or nil if nonelist *mSpanList // For debugging. TODO: Remove.startAddr uintptr // address of first byte of span aka s.base()npages uintptr // number of pages in spanmanualFreeList gclinkptr // list of free objects in mSpanManual spansfreeindex uintptrnelems uintptr // number of object in the span.allocCache uint64allocBits *gcBitsgcmarkBits *gcBitssweepgen uint32divMul uint16 // for divide by elemsize - divMagic.mulbaseMask uint16 // if non-0, elemsize is a power of 2, & this will get object allocation baseallocCount uint16 // number of allocated objectsspanclass spanClass // size class and noscan (uint8)state mSpanStateBox // mSpanInUse etc; accessed atomically (get/set methods)needzero uint8 // needs to be zeroed before allocationdivShift uint8 // for divide by elemsize - divMagic.shiftdivShift2 uint8 // for divide by elemsize - divMagic.shift2elemsize uintptr // computed from sizeclass or from npageslimit uintptr // end of data in spanspeciallock mutex // guards specials listspecials *special // linked list of special records sorted by offset.
}
那么要想区分不同规格的span
,必须要有一个标识,每个span
通过spanclass
标识属于哪种规格的span
,golang的span
规格一共有67种,具体如下
// Code generated by mksizeclasses.go; DO NOT EDIT.
//go:generate go run mksizeclasses.gopackage runtime// class bytes/obj bytes/span objects tail waste max waste
// 1 8 8192 1024 0 87.50%
// 2 16 8192 512 0 43.75%
// 3 32 8192 256 0 46.88%
// 4 48 8192 170 32 31.52%
// 5 64 8192 128 0 23.44%
// 6 80 8192 102 32 19.07%
// 7 96 8192 85 32 15.95%
// 8 112 8192 73 16 13.56%
// 9 128 8192 64 0 11.72%
// 10 144 8192 56 128 11.82%
// 11 160 8192 51 32 9.73%
// 12 176 8192 46 96 9.59%
// 13 192 8192 42 128 9.25%
// 14 208 8192 39 80 8.12%
// 15 224 8192 36 128 8.15%
// 16 240 8192 34 32 6.62%
// 17 256 8192 32 0 5.86%
// 18 288 8192 28 128 12.16%
// 19 320 8192 25 192 11.80%
// 20 352 8192 23 96 9.88%
// 21 384 8192 21 128 9.51%
// 22 416 8192 19 288 10.71%
// 23 448 8192 18 128 8.37%
// 24 480 8192 17 32 6.82%
// 25 512 8192 16 0 6.05%
// 26 576 8192 14 128 12.33%
// 27 640 8192 12 512 15.48%
// 28 704 8192 11 448 13.93%
// 29 768 8192 10 512 13.94%
// 30 896 8192 9 128 15.52%
// 31 1024 8192 8 0 12.40%
// 32 1152 8192 7 128 12.41%
// 33 1280 8192 6 512 15.55%
// 34 1408 16384 11 896 14.00%
// 35 1536 8192 5 512 14.00%
// 36 1792 16384 9 256 15.57%
// 37 2048 8192 4 0 12.45%
// 38 2304 16384 7 256 12.46%
// 39 2688 8192 3 128 15.59%
// 40 3072 24576 8 0 12.47%
// 41 3200 16384 5 384 6.22%
// 42 3456 24576 7 384 8.83%
// 43 4096 8192 2 0 15.60%
// 44 4864 24576 5 256 16.65%
// 45 5376 16384 3 256 10.92%
// 46 6144 24576 4 0 12.48%
// 47 6528 32768 5 128 6.23%
// 48 6784 40960 6 256 4.36%
// 49 6912 49152 7 768 3.37%
// 50 8192 8192 1 0 15.61%
// 51 9472 57344 6 512 14.28%
// 52 9728 49152 5 512 3.64%
// 53 10240 40960 4 0 4.99%
// 54 10880 32768 3 128 6.24%
// 55 12288 24576 2 0 11.45%
// 56 13568 40960 3 256 9.99%
// 57 14336 57344 4 0 5.35%
// 58 16384 16384 1 0 12.49%
// 59 18432 73728 4 0 11.11%
// 60 19072 57344 3 128 3.57%
// 61 20480 40960 2 0 6.87%
// 62 21760 65536 3 256 6.25%
// 63 24576 24576 1 0 11.45%
// 64 27264 81920 3 128 10.00%
// 65 28672 57344 2 0 4.91%
// 66 32768 32768 1 0 12.50%const (_MaxSmallSize = 32768smallSizeDiv = 8smallSizeMax = 1024largeSizeDiv = 128_NumSizeClasses = 67_PageShift = 13
)var class_to_size = [_NumSizeClasses]uint16{0, 8, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 896, 1024, 1152, 1280, 1408, 1536, 1792, 2048, 2304, 2688, 3072, 3200, 3456, 4096, 4864, 5376, 6144, 6528, 6784, 6912, 8192, 9472, 9728, 10240, 10880, 12288, 13568, 14336, 16384, 18432, 19072, 20480, 21760, 24576, 27264, 28672, 32768}
var class_to_allocnpages = [_NumSizeClasses]uint8{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 2, 3, 1, 3, 2, 3, 4, 5, 6, 1, 7, 6, 5, 4, 3, 5, 7, 2, 9, 7, 5, 8, 3, 10, 7, 4}type divMagic struct {shift uint8shift2 uint8mul uint16baseMask uint16
}var class_to_divmagic = [_NumSizeClasses]divMagic{{0, 0, 0, 0}, {3, 0, 1, 65528}, {4, 0, 1, 65520}, {5, 0, 1, 65504}, {4, 11, 683, 0}, {6, 0, 1, 65472}, {4, 10, 205, 0}, {5, 9, 171, 0}, {4, 11, 293, 0}, {7, 0, 1, 65408}, {4, 13, 911, 0}, {5, 10, 205, 0}, {4, 12, 373, 0}, {6, 9, 171, 0}, {4, 13, 631, 0}, {5, 11, 293, 0}, {4, 13, 547, 0}, {8, 0, 1, 65280}, {5, 9, 57, 0}, {6, 9, 103, 0}, {5, 12, 373, 0}, {7, 7, 43, 0}, {5, 10, 79, 0}, {6, 10, 147, 0}, {5, 11, 137, 0}, {9, 0, 1, 65024}, {6, 9, 57, 0}, {7, 9, 103, 0}, {6, 11, 187, 0}, {8, 7, 43, 0}, {7, 8, 37, 0}, {10, 0, 1, 64512}, {7, 9, 57, 0}, {8, 6, 13, 0}, {7, 11, 187, 0}, {9, 5, 11, 0}, {8, 8, 37, 0}, {11, 0, 1, 63488}, {8, 9, 57, 0}, {7, 10, 49, 0}, {10, 5, 11, 0}, {7, 10, 41, 0}, {7, 9, 19, 0}, {12, 0, 1, 61440}, {8, 9, 27, 0}, {8, 10, 49, 0}, {11, 5, 11, 0}, {7, 13, 161, 0}, {7, 13, 155, 0}, {8, 9, 19, 0}, {13, 0, 1, 57344}, {8, 12, 111, 0}, {9, 9, 27, 0}, {11, 6, 13, 0}, {7, 14, 193, 0}, {12, 3, 3, 0}, {8, 13, 155, 0}, {11, 8, 37, 0}, {14, 0, 1, 49152}, {11, 8, 29, 0}, {7, 13, 55, 0}, {12, 5, 7, 0}, {8, 14, 193, 0}, {13, 3, 3, 0}, {7, 14, 77, 0}, {12, 7, 19, 0}, {15, 0, 1, 32768}}
var size_to_class8 = [smallSizeMax/smallSizeDiv + 1]uint8{0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}
var size_to_class128 = [(_MaxSmallSize-smallSizeMax)/largeSizeDiv + 1]uint8{31, 32, 33, 34, 35, 36, 36, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 47, 47, 47, 48, 48, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66}
每个mspan按照它自身的属性size class
的大小分割成若干个object,每个object可存储一个对西那个,并且会使用一个位图来标记其尚未使用的object。属性seze class决定object大小,而mspan只会分配给和object尺寸大小接近的对象。但让,对象的大小要小于object的大小
疑惑:
type T1 struct {//24A uint8 //1B uint16 //2E uint8 //1C uint32 //4D uint64 //8
}
type T2 struct {// 16A uint8 //1E uint8 //1B uint16 //2C uint32 //4 D uint64 //8
}T1 sizeof: 24,alignof:8
T2 sizeof: 16,alignof:8
为什么T1的T1.A, T1.B, T1.E, T1.C 合为8bytes但是还进行了填充对齐呢,而tT2将T2.A, T2.B, T2.E, T2.C四个的内存偏移正好是8bytes,就没有出现填充对齐呢?
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 解决 Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。
这个错误为端口被其它应用占用(比较常见的就是酷狗音乐)比如你开着酷狗音乐运行Django项目时就会出现这个错误(Flask端口设为8000时也一样)之前解决这个问题的方法是先把酷狗音乐关掉再运行项目或者更改项目的端口号其实这个问题还有一个更好且更容易操作的解决办法——更改…...
2024/4/15 14:25:53 - isis简要原理、实验和常用命令
本文阅读大概5分钟,可以掌握isis基本概念和配置方法isis简介isis和ospf一样,都是链路状态路由协议,工作原理也类似。但是应用场景和ospf不同,isis主要用于运营商,运营商也就是ISP,Internet service provider,互联网服务提供商,简单点来说,就是我们需要上网,会从电信联…...
2024/4/24 11:16:57 - SSM框架之Mybatis笔记07使用注解开发
面向接口编程大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好 在一个面向对象的系统中,…...
2024/5/2 5:24:34 - jsonp概念原理以及实现
jsonp 1、为什么会有跨域 浏览器是同源策略,他是一个约定也是最核心的内容,同时也是安全性的最佳保障。试想一下,如果没有这种限制的话,一个页面同时加载了a与b两个域下的js文件,那么他们的document以及cookie等信息都是共享的,也就是说a可以拿到b域下的信息,反之b也可以…...
2024/4/15 19:10:23 - WPF实现响应鼠标位置粒子背景动画特效
实现效果如下:参考博文:WPF星空效果实现步骤:1、粒子类Particle.cspublic class Particle{/// <summary>/// 形状/// </summary>public Ellipse Shape;/// <summary>/// 坐标/// </summary>public Point Position;/// <summary>/// 速度/// &…...
2024/5/9 2:19:58 - 共享盘/共享媒资/共享存储管理工具
找到一个比较好的共享管理工具1、可以配合群晖、openfile等存储对用户进行访问呢控制2、可以保留用户操作记录3、可以限制用户对特定位置的读写4、可以制定文件夹命名规范5、可以快速进行共享文件搜索(需要数据库支持)。6、可以按条件进行文件归集。具体请参看文档:链接:ht…...
2024/5/8 14:05:11 - MLX90640-D110 是一款红外热像仪模块,32×24像素,附上NODE-32S的测试程序.
程序110度及55度都是通用的,不用修改,均是I2C接口 这个是Adafruit公司的模块这个是SPARKFUN公司的模块以下转载于网络(WX) 硬件说明 通信协议 MLX90640-D55 Thermal Camera的通讯协议为I2C,支持I2C高速模式(最高可达1MHz),只能作为I2C总线上的从设备,SDA和SCL端口可以承受5V电压…...
2024/4/15 19:10:19 - SQL语句中的几种类型
1.数据定义语言DDL(Data Definition Language)2.数据查询语言DQL(Data Query Language)3.数据操纵语言DML( Data Manipulation Language)4.数据控制语言DCL( Data Control Language)...
2024/5/1 23:12:11 - 物理层1
什么是物理层? 物理层考虑的是怎么样在各种计算机的***传输媒体上传输数据比特流***,而不是指具体的传输媒体。 物理层的作用:是尽可能的屏蔽掉不同传输媒体和通讯手段差异。 物理层的主要任务:确定与传输媒体额接口特性。机械特性:指明接口所用接线器的形状和尺寸、引线数…...
2024/5/3 4:36:28 - XP系统 连接USB无线网卡时,报错显示网络不在区域中。
Windows XP系统连接USB无线网卡显示网络不在区域中,请刷新尝试连接。(报错信息,如图1.)解决办法: **1,**网上很多都说去下载kb893357补丁,去修复一下就好了。然后打补丁的时候你会发现是这样的:2.然后你又去网上找补KB917021的补丁,等下花钱下载,然后安装的时候又是这…...
2024/4/29 3:36:17 - Pytorch——ImageFolder简单使用
一、ImageFolderImageFolder会将目录中的文件夹名自动转化成序列,每个文件夹下会存储相同的一个类别,文件夹名为类名;当DataLoader载入时,标签自动就是整数序列了;还是先查看一下用法:help(datasets.ImageFolder)class ImageFolder(DatasetFolder)函数构造: | ImageFol…...
2024/5/3 17:26:28 - 进程调度算法小结
不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。1.批处理系统批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终止的时间)。1.1 先来先服务 first-come first-serverd(FCFS)非抢占式的调度算法,按照请求的顺序…...
2024/4/15 19:10:15 - css基础属性
div {font-size:50px } css代码写在两个大括号之间,里面写属性,属性格式为 属性名1:属性值1; 属性名2:属性值;。。。。。 font-size设置的是字体的高。<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><…...
2024/4/17 4:44:25 - (转载)直播带货系统中的短视频素材捕获方式
主要需求:1. 采集摄像头和麦克风,并生成文件2. 为录制的视频添加字幕3. 为录制的视频背景音乐,背景音的音量要能调节4. 添加片头和片尾5. 最终生成的文件体积要小,方便上传技术分析1. 首先是音视频捕获2. 因为需要到要上传,所以需要对采集后的视频文件做编码处理,直接调用…...
2024/4/17 15:45:35 - 使用HUE创建Hbase表及插入数据
1.打开hbase browser,点击“新建表”。2.点进新创建的表中,点击页面右下角“新建行”提交即可。...
2024/4/15 14:26:07 - js中检测数据类型的方式
js中的数据类型有: 基本数据类型: Undefined, Null, Boolean, Number, String 复杂数据类型: Object 1. typeof 操作符的用法缺点:检测引用类型的值时,用处不大; 对于对象,null类型的数据均返回object,无法具体区分,console.log(typeof hello); //string console.lo…...
2024/5/2 3:11:31 - 直播带货源码能盈利,不只靠主播的一张嘴
直播带货源码一靠货物二靠主播,现在各直播平台并不缺少网红主播,难得是主播如何靠自身的优势进行变现。电商运营模式早就出现了转变只是那时的直播行业还不成熟,也只局限于头部商家能卖出极高的销售量,对于腰尾部商家并不友好。为了电商行业整体进步发展,淘宝最早提供了新…...
2024/5/1 13:19:51 - 软需---软件需求过程
软件需求过程可行性研究 可行性研究是一个面向管理的活动,经过可行性研究,管理人员需要做出启动该项目与否的重要决定 可行性研究对象当前组织系统,如用户、规章、功能、目标等当前组织系统中的问题,如功能及性能的不一致,不充分新系统的目标及需求,如有哪些问题需要解决…...
2024/4/21 11:51:54 - 【JavaSE】基础13_异常,throws关键字,throw关键字,自定义异常
文章目录1.异常2.异常的类型体系结构3.异常的处理4.异常练习5.throws关键字6.throw关键字7.自定义异常1.异常package com.atguigu.test03;import java.util.Scanner; /** 异常:* 不正常* 在某些情况下,因为用户的一些原因,例如:配置问题、错误输入的问题、用户磁盘空间满…...
2024/4/29 12:25:25 - dos
新建文件夹命令:mkdir 文件名 新建文件命令: type nul> 文件名.文件类型 echo “helloworld” > hello.log...
2024/5/1 18:00:19
最新文章
- Tkinter组件:Checkbutton
Tkinter组件:Checkbutton Checkbutton(多选按钮)组件用于实现确定是否选择的按钮。Checkbutton 组件可以包含文本或图像,你可以将一个 Python 的函数或方法与之相关联,当按钮被按下时,对应的函数或方法将被…...
2024/5/9 5:11:24 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - ChatGPT 初学者指南
原文:ChatGPT for Beginners 译者:飞龙 协议:CC BY-NC-SA 4.0 介绍 如果您一直关注新闻和趋势,您可能已经在某个地方读到或听到过,Sam Altman 的生成式人工智能平台 ChatGPT 已经将人工智能推向了一个新的高度 - 许多…...
2024/5/8 7:48:14 - __dirname 在ES模块中的使用
前言 ECMAScript模块是 JavaScript 的新标准格式。在Node.js中越来越多的库逐渐从从CommonJS转移到ES模块 注:这里是指“真”ES 模块并不是指代码中 Node.js 中使用 import 写法但是实际被 tsc 转成 commonJS 的形式 但是Node.js ES 开发中此前有一个棘手的问题是获…...
2024/5/7 13:42:25 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/5/8 19:32:33 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/5/7 22:31:36 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/5/9 2:44:26 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/8 20:33:13 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/5/9 3:15:57 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/5/7 16:57:02 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/5/7 14:58:59 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/5/8 20:58:56 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/9 1:35:21 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/5/9 4:12:16 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/5/7 16:05:05 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/5/8 18:06:50 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/5/8 1:37:32 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/5/9 1:42:21 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/5/9 5:02:59 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/5/9 4:31:45 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/5/8 12:44:41 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/5/8 9:51:44 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/5/8 1:37:29 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/5/9 4:33:29 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57